支持在正则表达式中,如果匹配一个替代项中的一个替代项,即使还剩下更多替代项,它也会停在那里(在交替之外的正则表达式中没有其他标记(。
源
这种模式搜索一个双词(例如,this this
(
b([a-z]+)((?:s|<[^>]+>)+)(1b)
如果我介绍这个主题,我有一个困惑:
它与父亲相匹配。
"<i>whatever<i> whatever"
b([a-z]+)
匹配
((?:<[^>]+>|s)+)
跟随一个 TAG,因此是第二个备选匹配项。
(1b)
如果跟随第一个括号中反向引用的相同单词,则必须匹配。
如果在标签之后不跟着"(1b)
",为什么要匹配,跟在空格后面。
我知道在交替中存在s
.
但是不应该让 TAG 匹配消耗交替吗?
为什么s
替代品还活着?
交替由+
量词控制:
(?:s|<[^>]+>)+
。所以它尝试多次匹配。 每次,它都可以尝试两种选择:第一个s
,如果失败,<[^>]+>
。
第一次,s
匹配失败,但<[^>]+>
成功匹配<i>
。
第二次,s
匹配一个空格。
第三次,s
匹配另一个空间。
。依此类推,直到所有空间都被消耗掉。
该+
的意思是"(?:s|<[^>]+>)
中的一个或多个"。是的,它们中的第一个会消耗标签,但在后面(1b)
之前可能有无限数量的附加标签或空格。
b([a-z]+)((?:s|<[^>]+>)+)(1b)
^