JS 正则表达式匹配 ipv6 地址

如果你想用正则表达式匹配IPV6地址,可以尝试用我的方式:

var re = /([0-9a-z]*:{1,4}){1,7}[0-9a-z]{1,4}/g

"sdjiabf 2409:8a55:4222:f1:307c:f263:fc95:64a8 sdjiam fe80::6666 fjiBFhiam 4422:23:43:53::9999".match (re)

// --> [
    "2409:8a55:4222:f1:307c:f263:fc95:64a8", 
    "fe80::6666", 
    "4422:23:43:53::9999"
]

史上最无敌,可以过滤多余文本,可以取出所有形式的 IPV6 地址

解析:

如果我们想要匹配一个最简单的 IPV6 地址,例如 : 2409:8a55:4222:f1:307c:f263:fc95:64a8

首先我们需要匹配出ip中的一小段,例如 2409:

/[0-9a-z]{1,4}:/g
–> [“2409:”, “8a55:”, “4222:”, “f1:”, “307c:”, “f263:”, “fc95:”]

但是我们还差最后一段 64a8 ,可以使用 [0-9a-z]{1,4}来匹配

于是合成起来如下:

/([0-9a-z]{1,4}:){7}[0-9a-z]{1,4}/g
–> [“2409:8a55:4222:f1:307c:f263:fc95:64a8”]

但是问题来了,如果你使用这个表达式去匹配我上边那段文字,就会出现这种情况:

只能匹配到一段,原因是我们的写法宽容度还不够

ipv6地址中间可能会出点两个::,那么我们只要无视数字和字母,让他至少匹配出一个冒号,问题就解决了

/([0-9a-z]*:{1,4}){1,7}[0-9a-z]{1,4}/g

将冒号的匹配提前,用 * 标识符让他至少匹配出一个冒号,再限制它至少要匹配一段ip,就解决了。

但是不知道为啥在python里用不了,可能两种语言的正则格式不一样吧,比较操蛋

留下评论