交替中的混乱

时间:2011-06-22 00:03:32

标签: php regex regex-alternation

支持在正则表达式中,如果匹配替换中的一个替代,它会在那里停止,即使还有更多替代选择(在交替之外的正则表达式中没有其他令牌)。

Source

此模式搜索一个双字(例如this this

\b([a-z]+)((?:\s|<[^>]+>)+)(\1\b)

如果我介绍这个主题,我有一个困惑:

与patern匹配。

"<i>whatever<i>         whatever"

\b([a-z]+)匹配

((?:<[^>]+>|\s)+)关注一个TAG,所以第二个替代匹配。

(\1\b)必须匹配,如果在第一个括号中后面引用相同的单词。

为什么匹配标签不在“(\1\b)”之后,跟随空格。

我知道在交替中存在\s

但是不应该认为TAG匹配会消耗交替吗?

为什么\s替代品还活着?

2 个答案:

答案 0 :(得分:2)

+表示“(?:\s|<[^>]+>)中的一个或多个”。是的,它们的第一个会占用标记,但在(\1\b)之后可能会有无数个额外的标记或空格。

\b([a-z]+)((?:\s|<[^>]+>)+)(\1\b)
                         ^

答案 1 :(得分:2)

交替由+量词控制:

(?:\s|<[^>]+>)+

...所以它试图多次匹配。每次,它都可以尝试两种选择:首先\s,如果失败,<[^>]+>

第一次\s无法匹配,但<[^>]+>成功匹配<i>

第二次,\s匹配一个空格。

第三次,\s与另一个空格匹配。

......依此类推,直到消耗掉所有空格。