支持在正则表达式中,如果匹配替换中的一个替代,它会在那里停止,即使还有更多替代选择(在交替之外的正则表达式中没有其他令牌)。
此模式搜索一个双字(例如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
替代品还活着?
答案 0 :(得分:2)
+
表示“(?:\s|<[^>]+>)
中的一个或多个”。是的,它们的第一个会占用标记,但在(\1\b)
之后可能会有无数个额外的标记或空格。
\b([a-z]+)((?:\s|<[^>]+>)+)(\1\b)
^
答案 1 :(得分:2)
交替由+
量词控制:
(?:\s|<[^>]+>)+
...所以它试图多次匹配。每次,它都可以尝试两种选择:首先\s
,如果失败,<[^>]+>
。
第一次\s
无法匹配,但<[^>]+>
成功匹配<i>
。
第二次,\s
匹配一个空格。
第三次,\s
与另一个空格匹配。
......依此类推,直到消耗掉所有空格。