【问题标题】:How to compress IPV6 address using javascript?如何使用 javascript 压缩 IPV6 地址?
【发布时间】:2017-11-09 23:03:02
【问题描述】:

我在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

【问题讨论】:

  • 不要将标签pattern-matching用于正则表达式问题。
  • \b(?:0+:){2,} 替换为:Check it out at regex101.
  • @ClasG 你的意思是 subjectString.replace("::?(?!\\S*\\b\\1:0\\b)(\\S*)", ":: 2美元”)? .试过但没有运气
  • 不;)看我的回答
  • subjectString.replace(/(^|:)0+(?!(?::|$))/g, "$1").replace(/(:(?:0:){2,})(?!\S*(?:\1)0:)/, "::") 待会再解释

标签: javascript regex pattern-matching


【解决方案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 中,您省略了 global 标志。在 PHP 中,您将 preg_replace$limit 设置为 1。

【讨论】:

    【解决方案2】:

    你可以通过替换来做到这一点

    \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.

    【讨论】:

    • 哇。谢谢@ClasG
    • 此答案不会删除前导 0
    【解决方案3】:

    您可以使用此方法来压缩 IPv6 并删除前导 0:

       
    
    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') );

    【讨论】:

    • 欢迎来到 SO。请善待并编写简短的介绍性段落,将您的代码置于(问题的)上下文中。
    猜你喜欢
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2017-04-11
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    相关资源
    最近更新 更多