在尝试使用正则匹配 12-128 时,发现可以匹配到129,如题。
/ 192.168.0.(12[0-8]|1[0-1][0-9]|[2-9][0-9]|1[2-9]) /
匹配 129 时返回true。
判断 255 也会匹配到前两位 25。
如何能避免此类情况出现?
或者是用其他写法?
在尝试使用正则匹配 12-128 时,发现可以匹配到129,如题。
/ 192.168.0.(12[0-8]|1[0-1][0-9]|[2-9][0-9]|1[2-9]) /
匹配 129 时返回true。
判断 255 也会匹配到前两位 25。
如何能避免此类情况出现?
或者是用其他写法?
这种需求建议就不要用正则实现,直接用正则粗略过滤是个正整数,然后再转成整数判断一下大小就行了,反正js在前端执行,这个速度又不会太慢,还容易维护,你觉得你写个这个正则后面你自己还能看得懂吗?
EDIT,没细看你的需求,你这个需求完全不应该用正则去实现,而应该直接用ipv4的解析类库去搞,直接限定ip段岂不美哉?
对数字区间通常是分段写正则,例如12-128,分成:12-19, 20-99, 100-119,120-128:/^((1[2-9])|([2-9][0-9])|(1[01][0-9])|(12[0-8]))$/
对于更复杂的,还是直接提取数字,然后if/else判断吧,简单的正则+简单的判断总比复杂的正则好。
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
这个正则的意思是只要测试的字符串里面
存在一个子字符串
使得这个正则匹配,那么就会返回true
,所以当你使用'192.168.0.129'
去测试的时候,因为子字符串192.168.0.12
是满足要求的,所以测试结果是true
。所以想要避免这种情况,需要在正则的开始添加
^
,在正则的最后添加$
。^
匹配字符串的开头,匹配的是一个位置;$
匹配字符串的结尾,匹配的是一个位置;加上
^
$
的正则的意思是,这个字符串要整个
匹配这个表达式,而不是其中的某个子串匹配
就可以。这个时候测试'192.168.0.129'
就会返回false
了.如果你的需求就是判断
子串
中是否有匹配的情况,那么你可以简单的在后面添加一个断言
,使得后面的字符不是数字: