正则捕获顺序:贪婪模式后匹配错误的替代方案



我有此模式:

(w+)(sin|in|pak|red)$

和替换模式是:

$1tak

问题是这个词:

setesin

将转换为:

setestak

而不是

setetak

由于某种原因,in总是以模式为sin

如何执行模式遵循该顺序?

使用懒惰量词:

(w+?)(sin|in|pak|red)$
    ^

请参阅Regex Demo

w+包含一个贪婪的量化器:1)抓住尽可能多的字符(并注意它可以匹配 si,所有字母,数字和下凸出),然后再回溯左),试图适应后续模式。由于首先找到in,因此将其匹配,并且整个组被认为是匹配的,因此,将正则连续使用$检查字符串的末端。懒惰的量词将在匹配1个单词char之后,将跳过w+?,然后尝试其他模式,从左向右移动。

根本不使用量词:

(w)(?:sin|in|pak|red)$

使用相同的替换

B(?:sin|in|pak|red)$

tak作为替换。非词边界B可确保之前有一个单词字符(如果第一个单词字符不是强制性的,则交替删除B)。

通过这两种方式,首先找到了左侧的第一次出现,并且贪婪的量词不会消耗。

最新更新