0

假设在一个正则表达式中,如果匹配一个替代项中的一个替代项,即使还有更多替代项(替代项之外的正则表达式中没有其他标记),它也会停在那里。

来源

这种搜索一个双字的模式(例如,this this

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

如果我介绍这个主题,我会感到困惑:

它与模式匹配。

"<i>whatever<i>         whatever"

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

((?:<[^>]+>|\s)+)跟随一个 TAG,因此是第二个替代匹配。

(\1\b) 如果跟随在第一个括号中反向引用的相同单词,则必须匹配。

如果标签后面不跟在“”后面,为什么要匹配(\1\b),跟在空格后面。

我知道轮换之内是存在的\s

但是不应该是TAG比赛消耗交替吗?

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

4

2 回答 2

2

+意味着“一个或多个(?:\s|<[^>]+>)”。是的,它们中的第一个(\1\b)使用标签,但在跟随之前可能有无限数量的附加标签或空格。

\b([a-z]+)((?:\s|<[^>]+>)+)(\1\b)
                         ^
于 2011-06-22T02:01:21.590 回答
2

交替由+量词控制:

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

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

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

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

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

...依此类推,直到所有空间都被耗尽。

于 2011-06-22T02:01:48.167 回答