regex 如何使用javascript压缩IPV6地址?

djp7away  于 2022-11-26  发布在  Java
关注(0)|答案(4)|浏览(169)

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

yzckvree

yzckvree1#

@ClasG的另一个答案有几个问题:
1.如果重复的零位于IPv6地址的开头或全部为零,则仅替换1个冒号。
1.如果重复的零位于末尾,则不会替换它们。
我建议使用正则表达式\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中,您可以省略gglobal旗标。在PHP中,您可以将preg_replace$limit设定为1。

vvppvyoh

vvppvyoh2#

您可以通过替换

\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

fzsnzjdm

fzsnzjdm3#

您可以使用此方法来压缩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') );
vmdwslir

vmdwslir4#

您可以使用考虑所有需要情况的函数:

const compressIPV6 = (ip) => {
  //First remove the leading 0s of the octets. If it's '0000', replace with '0'
  let output = ip.split(':').map(terms => terms.replace(/\b0+/g, '') || '0').join(":");

  //Then search for all occurrences of continuous '0' octets
  let zeros = [...output.matchAll(/\b:?(?:0+:?){2,}/g)];

  //If there are occurences, see which is the longest one and replace it with '::'
  if (zeros.length > 0) {
    let max = '';
    zeros.forEach(item => {
      if (item[0].replaceAll(':', '').length > max.replaceAll(':', '').length) {
        max = item[0];
      }
    })
    output = output.replace(max, '::');
  }
  return output;
}

document.write(compressIPV6('38c1:3db8:0000:0000:0000:0000:0043:000a') + '<br/>');
document.write(compressIPV6('0000:0000:0000:0000:38c1:3db8:0043:000a') + '<br/>');
document.write(compressIPV6('38c1:3db8:0000:0043:000a:0000:0000:0000') + '<br/>');
document.write(compressIPV6('38c1:0000:0000:3db8:0000:0000:0000:12ab') + '<br/>');

如果出现多个相同长度的连续“0”八位字节,则只替换第一个。无论重复的零是在开头、中间还是结尾,此操作都有效。

相关问题