我有这种模式:
(\w+)(sin|in|pak|red)$
替换模式是这样的:
$1tak
问题是这个词:
setesin
将转换为:
setestak
而不是
setetak
出于某种原因,in
始终优先于模式中的sin
。
如何强制执行该模式以遵循该顺序?
答案 0 :(得分:9)
使用延迟量词:
(\w+?)(sin|in|pak|red)$
^
请参阅regex demo
\w+
包含一个贪婪的量词:1)抓取尽可能多的字符(并注意它可以匹配s
,i
,所有字母,数字和下划线)和然后回溯(从右到左产生一个接一个的字符),试图适应后续的模式。由于首先找到in
,它被匹配,并且整个组被认为是匹配的,正则表达式继续用$
检查字符串的结尾。在匹配1个字符字符后,惰性量词将使正则表达式引擎跳过\w+?
,并且将尝试其他模式,从左向右移动。
答案 1 :(得分:3)
根本不要使用量词:
(\w)(?:sin|in|pak|red)$
使用相同的替换
或
\B(?:sin|in|pak|red)$
以tak
作为替代。非单词边界\B
确保之前有单词字符(如果在交替删除\B
之前第一个单词字符不是强制性的。)
通过这两种方式,左边第一次出现的内容首先被发现,而不被贪婪的量词所消耗。