如何正则匹配到 12-128 ,而不会匹配到129的前两位12?

在尝试使用正则匹配 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。

如何能避免此类情况出现?

或者是用其他写法?

阅读 4.2k
3 个回答
/192.168.0.(12[0-8]|1[0-1][0-9]|[2-9][0-9]|1[2-9])/

这个正则的意思是只要测试的字符串里面存在一个子字符串使得这个正则匹配,那么就会返回true,所以当你使用'192.168.0.129'去测试的时候,因为子字符串192.168.0.12是满足要求的,所以测试结果是true

所以想要避免这种情况,需要在正则的开始添加^,在正则的最后添加$
^匹配字符串的开头,匹配的是一个位置;
$匹配字符串的结尾,匹配的是一个位置;

/^192.168.0.(12[0-8]|1[0-1][0-9]|[2-9][0-9]|1[2-9])$/

加上^ $的正则的意思是,这个字符串要整个匹配这个表达式,而不是其中的某个子串匹配就可以。这个时候测试'192.168.0.129'就会返回false了.

如果你的需求就是判断子串中是否有匹配的情况,那么你可以简单的在后面添加一个断言,使得后面的字符不是数字:

/192.168.0.(12[0-8]|1[0-1][0-9]|[2-9][0-9]|1[2-9])(?![0-9])/

这种需求建议就不要用正则实现,直接用正则粗略过滤是个正整数,然后再转成整数判断一下大小就行了,反正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判断吧,简单的正则+简单的判断总比复杂的正则好。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题