我正在检查正则表达式,无法理解为什么正则表达式与给定字符串不匹配,具体来说:
regex = /(ab*)+(bc)?/
mystring = "abbc"
匹配项与"abb"
匹配,但c
已关闭。我使用Rubular和IRB测试了这个,并且不明白为什么正则表达式与整个字符串不匹配。我认为(ab*)+
与"ab"
匹配,然后(bc)?
与"bc"
匹配。
我是否缺少正则表达式操作的优先级?
答案 0 :(得分:5)
正则表达式尝试在默认情况下尽可能地匹配正则表达式的第一部分,并且它们不回溯以尝试使更大的部分匹配(如果他们不需要)。由于您(bc)
是可选的,(ab*)
可以匹配它想要的(非零重复之后没有太多事情要做),并且不会尝试回溯以尝试其他匹配的替代方案
如果你想匹配整个字符串(在这种情况下会强制一些回溯),请确保你锚定字符串的两端:
regex = /^(ab*)+(bc)?$/
答案 1 :(得分:3)
带括号的正则表达式假设您的字符串中有两个匹配项。
第一个是abb
,因为(ab*)
表示a
,零或更多b
。您有两个b
,因此匹配为abb
。然后,您的字符串中只有c
,因此它与bc
的第二个条件不匹配。