gpt4 book ai didi

regex - 使用正则表达式验证 IPv4 地址

转载 作者:行者123 更新时间:2023-12-03 05:34:34 25 4
gpt4 key购买 nike

我一直在尝试获得一个有效的正则表达式来进行 IPv4 验证,但运气不佳。似乎有一次我已经用 (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4},但它会产生一些奇怪的结果:

$ grep --version
grep (GNU grep) 2.7
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.1
192.168.1.1
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.255
192.168.1.255
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.255.255
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.2555
192.168.1.2555

我进行了搜索,看看是否已经有人提出并回答了这个问题,但其他答案似乎只是显示了如何确定 4 组 1-3 个数字,或者对我不起作用。

最佳答案

目前最佳(43 个字符)

^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$

此版本将内容缩短了另外 6 个字符,同时没有使用负向前查找,这在某些正则表达式风格中不受支持。

最新、最短、可读性最差的版本(49 个字符)

^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)(\.(?!$)|$)) {4}$

[0-9] block 可以在 2 个位置用 \d 替换 - 使其可读性稍差,但肯定更短。

更新、更短、可读性第二差的版本(55 个字符)

^((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])(\.(?! $)|$)){4}$

此版本查找 250-5 的情况,然后巧妙地对所有可能的情况进行“或”操作,得到 200-249 100-199 10-99 案例。请注意,|) 部分不是错误,而是实际上对 0-9 范围的最后一种情况进行了或运算。我还省略了 ?: 非捕获组部分,因为我们并不真正关心捕获的项目,如果我们没有完全匹配,它们也不会被捕获第一名。

旧的和较短的版本(可读性较差)(63 个字符)

^(?:(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9 ])(\.(?!$)|$)){4}$

旧(可读)版本(70 个字符)

^(?:(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0- 9]|[0-9])(\.(?!$)|$)){4}$

它使用否定前瞻 (?!) 来消除 ip 可能以 结尾的情况。

替代答案,使用一些较新的技术(71 个字符)

^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.){3}(25[0-5] ]|(2[0-4]|1\d|[1-9]|)\d)$

在不支持前瞻的正则表达式实现中很有用

最旧的答案(115 个字符)

^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}
(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$

我认为这是最准确和最严格的正则表达式,它不接受像000.021.01.0这样的东西。似乎这里的大多数其他答案都接受并且需要额外的正则表达式来拒绝类似的情况一 - 即 0 起始数字和以 .

结尾的 ip

关于regex - 使用正则表达式验证 IPv4 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5284147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com