如何用正则表达式区分数字与IP地址片段?
匹配非IP片段的X.Y格式数字正则方案
当使用正则\d+\.\d+时,会同时命中独立的X.Y格式数字(如5.56),以及IP地址的片段(比如183.55.0.144中的183.55、0.144)。我们需要一个正则,只匹配以下测试示例中的目标内容,同时排除IP片段:
测试示例
- 示例1:
<some_text> 5.56 <some_text>→ 需匹配5.56 - 示例2:
<some_text> 183.55.0.144 <some_text>→ 需排除所有IP片段 - 示例3:
4544445555.6877878487874→ 需匹配完整数字 - 示例4:
1.75.→ 需匹配1.75
已尝试的正则及问题
\d+\.\d+:会匹配IP片段,不符合要求\d+\.\d(?!\.):无法匹配示例4中末尾带点的1.75(?<!\.)\d+\.\d+:仍会匹配IP的最后一段(如0.144)(?<!\.)\d+\.\d(?!\.):同时限制前后无点,漏过示例4(?!(?:[0-9]{1,3}\.){3}[0-9]{1,3})\d+\.\d+(?!\.)\d+:逻辑接近但存在匹配漏洞\d+\.(?!(?:\.\d+){2})\d+:无法处理IP前半段的匹配问题(?<!(?:\.\d){2})\d+\.(?!(?:\.\d+){2})\d+:仍有部分IP片段会被误匹配
解决方案正则
使用结合负前瞻和负后顾的正则,精准排除IP片段:
(?<!\d\.)\d+\.\d+(?!\.\d)
正则解释
(?<!\d\.):负后顾断言,确保当前匹配的内容前面不是「数字+点」的结构,避免匹配IP的中间后段(如55.0这类属于IP的一部分)\d+\.\d+:核心匹配逻辑,匹配X.Y格式的数字(?!\.\d):负前瞻断言,确保当前匹配的内容后面不是「点+数字」的结构,避免匹配IP的前段(如183.55这类属于IP的一部分)
测试验证
- 示例1:成功匹配
5.56 - 示例2:IP地址中无符合规则的片段,全部排除
- 示例3:成功匹配完整的
4544445555.6877878487874 - 示例4:成功匹配
1.75(因为后面是单独的点而非「点+数字」,满足负前瞻条件)
内容的提问来源于stack exchange,提问作者Incognito
相关产品推荐
相关产品推荐

