JavaScript中如何用单个正则验证带星号通配符的IPv4/IPv6地址
可以用单个正则表达式实现该需求。你现有的正则无法匹配带星号地址的核心原因是未将*加入IP分段的合法取值范围,仅需要在原有正则的分段匹配规则中补充星号的匹配规则即可。
改造规则
- IPv4部分改造:将原有IPv4分段的匹配规则
([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])修改为([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]|\*),允许单个分段为星号。 - IPv6部分改造:将原有IPv6分段的匹配规则
[0-9A-Fa-f]{1,4}修改为([0-9A-Fa-f]{1,4}|\*),同时删除原有正则中多余的域名匹配逻辑(你的需求无域名校验场景),避免误匹配。
最终可用正则
^\s*(?:(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]|\*)\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]|\*)|(?:(?:[0-9A-Fa-f]{1,4}|\*):){7}(?:[0-9A-Fa-f]{1,4}|\*))\s*$
匹配范围说明
该正则可覆盖你提供的所有示例场景:
- 标准无星号IPv4地址,如
10.10.0.1、10.10.255.1 - 带任意位置星号的IPv4地址,如
10.10.*.1、10.10.10.*、10.10.*.* - 标准无星号IPv6地址(无
::压缩格式),如2001:db8:3333:4444:5555:6666:7777:8888 - 带任意位置星号的IPv6地址(无
::压缩格式),如684D:1111:222:3333:4444:5555:6:*、2001:db8:3333:4444:5555:6666:*:*、684D:1111:222:3333:4444:5555:*:77
如果你需要支持带::压缩格式的IPv6带星地址,只需要在原有IPv6压缩匹配逻辑中同步补充*的匹配规则即可。
内容的提问来源于stack exchange,提问作者Shubham Srivastava
相关产品推荐
相关产品推荐

