gpt4 book ai didi

javascript - 根据长度(<4)提取特殊字符之间的子串,并将缺少的字符替换为 0,使其变为 4

转载 作者:行者123 更新时间:2023-12-02 15:14:24 24 4
gpt4 key购买 nike

我正在尝试开发 IPv6 子网划分计算器,并且需要以其扩展格式显示地址。也就是说,假设我们有这个 IP 地址:2001:DB8:C003:1::F00D/48,我需要将 :: 替换为零,例如 :0000:0000:0000: 根据已存在的字段数(最多 8 个字段)。
我使用 switch 语句做到了这一点,但 IPv6 地址的压缩表示法也省略了前导零。从上面的IP地址来看,:DB8是压缩的。它实际上是 :0DB8,我也需要适应它。

这是我到目前为止所尝试过的:

代码

 /*To calculate hex field*/
var field = (ip.split(":").length - 1);

var condens = ":0000:0000:0000:0000:0000:0000:0000";

switch(field)
{
case 1:
{
var block=ip.substring(ip.lastIndexOf(":")+1,ip.lastIndexOf(":")); //to extract strings between the special character
var inputString = ip,
expand = inputString.replace(/(::)+/g, condens);
console.log(expand);
while(block.length < 4)
{
//replace fields only with missing characters with 0
}
$("#expand").attr("value",expand);
break;
}
case 2:
{
var inputString = ip,
expand = inputString.replace(/(::)+/g, ":0000:0000:0000:0000:0000:0000:0000");
console.log(expand);
$("#expand").attr("value",expand);
break;
}
case 3:
{
var inputString = ip,
expand = inputString.replace(/(::)+/g, ":0000:0000:0000:0000:0000:");
console.log(expand);
$("#expand").attr("value",expand);
break;
}
case 4:
{
var inputString = ip,
expand = inputString.replace(/(::)+/g, ":0000:0000:0000:0000:");
console.log(expand);
$("#expand").attr("value",expand);
break;
}
case 5:
{
var inputString = ip,
expand = inputString.replace(/(::)+/g, ":0000:0000:0000:");
console.log(expand);
$("#expand").attr("value",expand);
break;
}
case 6:
{
var inputString = ip,
expand = inputString.replace(/(::)+/g, ":0000:0000:");
console.log(expand);
$("#expand").attr("value",expand);
break;
}
}


如您所见,目前我正在提取 : 之间的子字符串。我只需要提取长度 < 4 的子字符串,并添加前导零以使长度达到 4。然后,将我提取的子字符串替换为新的子字符串(带前导零并打印它。

有人可以帮我吗?谢谢。

最佳答案

可以用更简单的方式完成:

var input = '2001:DB8:C003:1::F00D/48';

var tmp = input.split(/\//);
var ip = tmp[0];
var subnet = tmp[1];

// if the ip is compacted
if (ip.match('::')) {
// + 1 back because there is an extra empty element in the array (because of ::)
var missingPartsNumber = 8 - ip.split(':').length + 1;

// replace the :: by the number of : needed to have 8 parts in the ip
ip = ip.replace(/::/, pad('', missingPartsNumber + 1, ':'));
}

var paddedIp = ip.split(':').map(function (part) {
return pad(part, 4, '0')
}).join(':') + '/' + subnet; // add the subnet back if needed

// from http://stackoverflow.com/a/10073788/5388620
function pad(n, width, z) {
z = z || '0';
n = n + '';
return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
}

snippet.log('in : ' + input);
snippet.log('out: ' + paddedIp);
<script src="https://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

更新

更新了我的代码以实际返回有效的 IPV6,我使用了显式变量名称,因此很容易阅读。

关于javascript - 根据长度(<4)提取特殊字符之间的子串,并将缺少的字符替换为 0,使其变为 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34587456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com