交替中的混乱



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

这种模式搜索一个双词(例如,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)
                         ^

最新更新