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

时间:2016-11-28 13:34:27

标签: c# regex

我有这种模式:

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

替换模式是这样的:

$1tak

问题是这个词:

  

setesin

将转换为:

  

setestak

而不是

  

setetak

出于某种原因,in始终优先于模式中的sin

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

2 个答案:

答案 0 :(得分:9)

使用延迟量词:

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

请参阅regex demo

\w+包含一个贪婪的量词:1)抓取尽可能多的字符(并注意它可以匹配si,所有字母,数字和下划线)和然后回溯(从右到左产生一个接一个的字符),试图适应后续的模式。由于首先找到in,它被匹配,并且整个组被认为是匹配的,正则表达式继续用$检查字符串的结尾。在匹配1个字符字符后,惰性量词将使正则表达式引擎跳过\w+?,并且将尝试其他模式,从左向右移动。

答案 1 :(得分:3)

根本不要使用量词:

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

使用相同的替换

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

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

通过这两种方式,左边第一次出现的内容首先被发现,而不被贪婪的量词所消耗。