如何使用javascript压缩IPV6地址?

问题描述 投票:0回答:2

我已经看到了在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

javascript regex pattern-matching
2个回答
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/>'));

Check it out at regex101


1
投票

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

  1. 如果重复的零位于IPv6地址的开头或全为零,则仅替换1个冒号。
  2. 如果重复的零在最后,它们就不会被替换。

我建议使用正则表达式\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中,省略全局标志。在PHP中,将$limitpreg_replace设置为1。

© www.soinside.com 2019 - 2024. All rights reserved.