正则表达式取代优先级

时间:2013-09-25 09:20:58

标签: regex replace preg-replace regex-greedy

假设我有字符串:

we have apple, coconut and grapes.

如果我使用正则表达式:

^.*\b((apple)|(coconut)|(grape)|(grapes)).*$

替换为

|$2|$3|$4|$5

它会在|||grape|贪婪后输出.*,然后从右到左匹配。

在尝试第2组或第3组之前,我怎样才能优先考虑替换首先尝试第一个模式组(在我的示例中为'(apple)')作为整个字符串,依此类推当我在grapesgrape之间替换订单时,将输出更改为|||grapes|,就像只有一个字符匹配一样。

我可以使用多次替换来执行此操作,但我担心多次从mssql调用regex的开销可能会导致过多的开销。

2 个答案:

答案 0 :(得分:2)

尝试这样的事情吗?

^((?:.*?(\bapple\b))|(?:.*?(\bcoconut\b))|(?:.*?(\bgrape\b))|(?:.*?(\bgrapes\b))).*$

apple优先,然后是coconut,之后是grape,最后是grapes

答案 1 :(得分:0)

正则表达式替换中的替代方案是从左到右尝试的,因此您需要先填写较长的替代方案

^.*\b((apple)|(coconut)|(grapes)|(grape)).*$

或确保只使用另一个单词边界匹配整个单词:

^.*\b((apple)|(coconut)|(grape)|(grapes))\b.*$