Regex 正则表达式替换优先级

Regex 正则表达式替换优先级,regex,replace,preg-replace,regex-greedy,Regex,Replace,Preg Replace,Regex Greedy,假设我有字符串: we have apple, coconut and grapes. 如果我使用正则表达式: ^.*\b((apple)|(coconut)|(grape)|(grapes)).*$ 取代 |$2|$3|$4|$5 当它经过*时,它将输出| | | | | |,然后从右到左匹配 在尝试第2组或第3组之前,我如何确定替换的优先级,以首先尝试整个字符串的第一个模式组(在我的示例中为“(apple)”),依此类推,有点像当我替换grapes和grapes之间的顺序,将输出更改为

假设我有字符串:

we have apple, coconut and grapes.
如果我使用正则表达式:

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

|$2|$3|$4|$5
当它经过
*
时,它将输出
| | | | | |
,然后从右到左匹配

在尝试第2组或第3组之前,我如何确定替换的优先级,以首先尝试整个字符串的第一个模式组(在我的示例中为“(apple)”),依此类推,有点像当我替换
grapes
grapes
之间的顺序,将输出更改为
| | | grapes
时,一个字符匹配的情况


我可以使用多个替换来实现这一点,但我担心多次从mssql调用regex的开销可能会导致太多的开销。

在regex替换中,从左到右尝试替换,因此您需要先放置较长的替换

^.*\b((apple)|(coconut)|(grapes)|(grape)).*$
或者使用另一个单词边界,确保只有整个单词匹配:

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

试试这样吧

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

苹果
拥有优先权,然后是
椰子
,之后是
葡萄
,最后是
葡萄

你到底想做什么?你的最终预期结果是什么?这是你想要的吗?@Jerry是的,苹果就是我想要的,替换顺序应该是苹果、椰子、葡萄、葡萄@过路人不,如果我把
^.*.\b((椰子)|(苹果)|(葡萄)|(葡萄)).*.$
它仍然输出
|苹果|
很抱歉这个令人困惑的问题,葡萄和葡萄就在那里,例如,我真正想要的是匹配
(苹果)
或wathever是第一组,然后尝试匹配其他组。同样,在我的例子中,按长度排序也不会有任何效果,而且我已经给出了我的正则表达式的简化版本,我在组中还有其他的
。实际的正则表达式类似于
^.*\b((苹果|梨|李子|桃子)|(椰子|香蕉)|(葡萄[a-z]+[a-z]+浆果))\b$
。好的,这是一个完全不同的问题。然而,我仍然没有看到问题。首先尝试第一组,然后尝试第二组,然后尝试第三组。您的潜在匹配中没有重叠。将问题过于简单化不太可能得到有效的解决方案。如果将
(苹果)
替换为
(椰子)
,则
(椰子)
应该匹配,但这不会发生,
苹果
仍然匹配。请参见上面@Passerby的注释似乎这是最简单的方法,我将测试性能是否是最好的选择。效果很好,这正是我想要的,起初我不确定
?:
,以为这将是一些复杂的正则表达式,但现在我知道它只是非捕获组的符号。@clickstefan Awesome:)