我认为只有在我写一个正则表达式时才会发生这种情况。我有一个简单的正则表达式来验证一组分页号,稍后将提交到数据库,如5
,10
,25
,50
,{{1} },100
示例:
250
当我执行测试时,上面的正则表达式只会从数字 50,100 和 250 中删除/all|5|10|25|50|100|250/
,而不是来自0
! ?
在线示例:
http://viper-7.com/IbKFKw
我在这里做错了什么?这次我真的错过了什么?
答案 0 :(得分:10)
这是因为在字符串50
中,正则表达式首先匹配5
,这是有效的。在字符串250
中,正则表达式首先匹配25
,该值有效并在此处结束。
您可以尝试添加锚点:
/^(?:all|5|10|25|50|100|250)$/
这会强制正则表达式匹配整个字符串,因此返回正在寻找的正确匹配。
答案 1 :(得分:7)
从左到右尝试替代方案,因此匹配5
优先于50
。但是没有1
从0
切断10
。你可以简单地重新排序它们:
/all|250|100|50|25|10|5/
或者,将0
可选地添加到相关的替代方案中(由于?
贪婪,0
将匹配(如果存在)):
/all|50?|100?|250?/
或
/all|(?:5|10|25)0?/
如果这不是用于匹配而是用于验证(即检查整个字符串),那么请使用Jerry的建议并使用锚来确保您的号码周围没有不需要的字符:
/^(?:all|5|10|25|50|100|250)$/
(当然在(?:...)
里面你也可以使用我上面的任何模式,但现在优先级是无关紧要的,因为不允许不完整的匹配。)