【发布时间】:2022-01-17 18:04:05
【问题描述】:
我想使用正则表达式验证带有通配符 (*) 的 IP 地址。 我为 IPV4 和 IPV6 提出了以下正则表达式,但这些并不能验证所有用例。
IPV4
^((([0-9]{1,2})|(1[0-9]{2,2})|(2[0-4][0-9])|(25[ 0-5])|*).){3}(([0-9]{1,2})|(1[0-9]{2,2})|(2[0-4][0 -9])|(25[0-5])|*)$
此正则表达式与以下四种有效的 IPV4 格式 (https://regex101.com/r/RXf5yM/1) 不匹配。 我不确定我必须进行哪些更改才能允许这些。
192.*
192.0.*
192.*.2
*
IPV6
^\s*((((([0-9A-Fa-f]{1,4})|*):){7}((([0-9A-Fa-f]{1, 4})|*)|:))|(((([0-9A-Fa-f]{1,4})|*):){6}(:(([0-9A-Fa-f) ]{1,4})|*)|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(.(25[0 -5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(((([0-9A-Fa-f ]{1,4})|*):){5}(((:(([0-9A-Fa-f]{1,4})|*)){1,2})|:(( 25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(.(25[0-5]|2[0-4]\d| 1\d\d|[1-9]?\d)){3})|:))|(((([0-9A-Fa-f]{1,4})|*):){ 4}(((:(([0-9A-Fa-f]{1,4})|*)){1,3})|((:(([0-9A-Fa-f]{1 ,4})|*))?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(.(25[0- 5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(((([0-9A-Fa-f ]{1,4})|*):){3}(((:(([0-9A-Fa-f]{1,4})|*)){1,4})|((: (([0-9A-Fa-f]{1,4})|*)){0,2}:((25[0-5]|2[0-4]\d|1\d\d |[1-9]?\d)(.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})) |:))|(((([0-9A-Fa-f]{1,4})|*):){2}(((:(([0-9A-Fa-f]{1, 4})|*)){1,5})|((:(([0-9A-Fa-f]{1,4})|*)){0,3}:((25[0- 5]|2[0-4]\d|1\d\d|[1-9]?\d)(.(25[0-5]|2[0-4]\d|1\d\ d|[1-9]?\d)){3}))|:))|(((([0-9A-Fa-f]{1,4})|*):){1}( ((:(([0-9A-Fa-f]{1,4})|*)){1,6})|((:(([0-9A-Fa-f]{1,4} )|*)){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(.(25[0 -5 ]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:(([0-9A- Fa-f]{1,4})|*)){1,7})|((:(([0-9A-Fa-f]{1,4})|*)){0,5} :((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(.(25[0-5]|2[0-4] \d|1\d\d|[1-9]?\d)){3}))|:)))\s*$
此正则表达式与以下三种有效的 IPV6 格式不匹配。(https://regex101.com/r/ereIrE/1)
2001:DB8:0:0:0:*
2001:*:1
*
但它匹配一个无效的 IPV6 值与 "::*" -> 2404:66:4003::*:804
我需要修改正则表达式以仅允许有效值。我是正则表达式和 IP 地址概念的新手,无法弄清楚这一点。我需要在 JS 和 Java 中进行验证。 请帮帮我。
【问题讨论】:
-
你必须使用正则表达式吗?使用 split() 仅验证 .或:取决于 ip4/6
-
IPv6 模式清楚地表明您不应尝试使用单个正则表达式进行验证。
-
从网络工作原理的角度来看,这个 192.*.2 可能不应该被允许
-
这里有一个如何在没有 regEx 的情况下解决它的示例,因为这有点失控:jsfiddle.net/rjmy9zsw/3
标签: javascript java regex ip ip-address