Ruby 正则表达式的优先级



我正在审查正则表达式,无法理解为什么正则表达式与给定字符串不匹配,特别是:

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

比赛匹配"abb"c关闭。我使用 Rubular 和 IRB 对此进行了测试,但不明白为什么正则表达式与整个字符串不匹配。我以为(ab*)+会匹配"ab"然后(bc)?会匹配"bc".

我在正则表达式操作的优先级方面是否遗漏了某些内容?

默认情况下,

正则表达式会尝试尽可能匹配正则表达式的第一部分,如果没有必要,它们不会回溯以尝试使更大的部分匹配。由于您将(bc)设置为可选,因此(ab*)可以根据需要匹配(之后的非零重复没有太多可做),并且不会尝试回溯以尝试其他匹配的替代方案。

如果您希望匹配整个字符串(在这种情况下将强制回溯),请确保锚定字符串的两端:

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

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

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

最新更新