我已经看到了在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
你可以通过替换来做到这一点
\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/>'));
@ClasG的另一个答案有几个问题:
我建议使用正则表达式\b:?(?:0+:?){2,}
并将其替换为::
(两个冒号)
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中,将$limit
的preg_replace
设置为1。