我认为只有在我编写正则表达式时才会发生这种情况。我有一个简单的正则表达式来验证一组分页号,稍后将提交到数据库,例如5
, 10
, 25
, 50
, 100
,250
示例:
/all|5|10|25|50|100|250/
当我执行测试时,我上面的正则表达式0
仅从数字50、100和250中删除,而不是从10
!!?
在线示例:http:
//viper-7.com/IbKFKw
我在这里做错了什么?这次我真的错过了什么?
我认为只有在我编写正则表达式时才会发生这种情况。我有一个简单的正则表达式来验证一组分页号,稍后将提交到数据库,例如5
, 10
, 25
, 50
, 100
,250
示例:
/all|5|10|25|50|100|250/
当我执行测试时,我上面的正则表达式0
仅从数字50、100和250中删除,而不是从10
!!?
在线示例:http:
//viper-7.com/IbKFKw
我在这里做错了什么?这次我真的错过了什么?
这是因为在 string50
中,正则表达式首先匹配5
,这是有效的。在 string250
中,正则表达式首先匹配25
,这是有效的并在此处结束。
您可以尝试添加锚点:
/^(?:all|5|10|25|50|100|250)$/
这会强制正则表达式匹配整个字符串,因此返回您正在寻找的正确匹配。
从左到右尝试替代方案,因此匹配5
优先于50
. 但是没有1
办法切断0
from 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)$/
(当然在里面(?:...)
你也可以使用我上面的任何模式,但现在优先级无关紧要,因为不允许不完整的匹配。)