我正在审查正则表达式,无法理解为什么正则表达式与给定字符串不匹配,特别是:
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
不匹配。