Ruby正则表达式的优先级?

时间:2014-02-22 22:20:12

标签: ruby regex

我正在检查正则表达式,无法理解为什么正则表达式与给定字符串不匹配,具体来说:

regex = /(ab*)+(bc)?/ 
mystring  = "abbc"

匹配项与"abb"匹配,但c已关闭。我使用Rubular和IRB测试了这个,并且不明白为什么正则表达式与整个字符串不匹配。我认为(ab*)+"ab"匹配,然后(bc)?"bc"匹配。

我是否缺少正则表达式操作的优先级?

2 个答案:

答案 0 :(得分:5)

正则表达式尝试在默认情况下尽可能地匹配正则表达式的第一部分,并且它们回溯以尝试使更大的部分匹配(如果他们不需要)。由于您(bc)是可选的,(ab*)可以匹配它想要的(非零重复之后没有太多事情要做),并且不会尝试回溯以尝试其他匹配的替代方案

如果你想匹配整个字符串(在这种情况下会强制一些回溯),请确保你锚定字符串的两端:

regex = /^(ab*)+(bc)?$/ 

答案 1 :(得分:3)

带括号的正则表达式假设您的字符串中有两个匹配项。

第一个是abb,因为(ab*)表示a,零或更多b。您有两个b,因此匹配为abb。然后,您的字符串中只有c,因此它与bc的第二个条件不匹配。