如何使用javascript压缩IPV6地址?

时间:2017-06-08 09:43:47

标签: javascript regex pattern-matching

我已经看到了在java中压缩IPV6的代码。 link指定相同的内容。 下面是Java中的代码。 String resultString = subjectString.replaceAll("((?::0\\b){2,}):?(?!\\S*\\b\\1:0\\b)(\\S*)", "::$2"); 但是在Javascript中我很困惑,因为我怎么能得到正则表达式匹配相同。你能在这里分享一些指示吗?

示例:fe80:00:00:00:8e3:a11a:2a49:1148 结果:fe80 :: 8e3:a11a:2a49:1148

3 个答案:

答案 0 :(得分:3)

您可以通过替换

来实现
\b(?:0+:){2,}

:



function compIPV6(input) {
  return input.replace(/\b(?:0+:){2,}/, ':');
}

document.write(compIPV6('2001:db8:0:0:0:0:2:1') + '<br/>');
document.write(compIPV6('fe80:00:00:00:8e3:a11a:2a49:1148' + '<br/>'));
&#13;
&#13;
&#13;

Check it out at regex101

答案 1 :(得分:1)

@ClasG的另一个答案有几个问题:

  1. 如果重复的零位于IPv6地址的开头或者全为零,则只替换1个冒号。
  2. 如果重复的零结尾,则不会被替换。
  3. 我建议使用正则表达式\b:?(?:0+:?){2,}并将其替换为::(两个冒号)

    Regex101 tests

    JavaScript示例:

    var ips = [
    '2001:0db8:ac10:0000:0000:0000:0000:ffff',
    '2001:0db8:ac10:0000:0000:0000:0000:0000',
    '0:0:0:0:0:2001:0db8:ac10',
    '2001:0db8:ac10:aaaa:0000:bbbb:cccc:ffff',
    '2001:0db8:ac10:0000:0000:bbbb:00:00'	
    ];
    
    for (var i = 0; i < ips.length; i++) {
    document.write(ips[i].replace(/\b:?(?:0+:?){2,}/, '::') + "<br>"); 
    }

    注意:Regex101测试会替换多个重复的零组。在XYZ编程语言中,您必须将替换次数限制为1.在JavaScript中,省略 g lobal标志。在PHP中,您将$limit的{​​{1}}设置为1。

答案 2 :(得分:0)

//Use this in order to compress IPv6 AND remove leading 0s:

function compressIPV6(input) {
	var formatted = input.replace(/\b(?:0+:){2,}/, ':');
	var finalAddress = formatted.split(':')
		.map(function(octet) {
			return  octet.replace(/\b0+/g, '');
		}).join(':');
	return finalAddress;
}
document.write(compressIPV6('2001:0db8:0000:0000:0000:0000:1428:57ab') );