正则表达式匹配除提供的字符串之外的所有内容

Regex match everything except string provided

我无法理解如何使用正则表达式来匹配除提供的字符串以外的所有内容。我试过使用否定操作数 ?!,例如 (?!red|green|blue),但这似乎也不起作用。

假设我有一个如下所示的字符串:

red blue green purple

并且我想在 green 上进行否定匹配,以便我的结果匹配为:

red blue purple

我怎样才能做到这一点?

匹配绿色不同,您可以匹配绿色并将其替换掉。



例如在 PostGres 中:

select regexp_replace('red blue green purple','(green)','','g');

您还需要添加要捕获的内容,您要查找的正则表达式似乎就是这个

^(?!red|green|blue)([a-z0-9]+)$

您使用 (?! ... ) 的方法是正确的,但您必须记住这是一个负 前瞻性 ,而不仅仅是一个否定运算符。这意味着它会验证当前位置之后的文本是否 not 与您的前瞻模式匹配,如果匹配,则该位置的匹配失败。它 not 匹配任何内容。您仍然必须围绕它构建一个模式。以下是如何编写此类模式的示例:

(^| )(?!green)[^ ]*
  • (^| ) 字符串的开头 OR 文字 space 字符
  • (?!green) 断言字符串中的下一个字符不匹配“green”
  • [^ ]* 将所有内容匹配到下一个 space。我们可以安全地这样做,因为如果它是“绿色”,则前瞻已经失败了。

输入字符串:

red blue green purple

匹配项:

red blue purple

注意:查看您在 regex101 上测试模式的方式,我会指出该模式将匹配每个 space 分隔的项目作为单独的匹配项。不可能在正则表达式中匹配不连续的字符串,因此这是您将获得的最接近的解决方案。如果您需要一个单一的非连续匹配,您将需要重新编写您的程序或使用正则表达式以外的其他东西。

实现此目的的一个简单方法是使用环顾四周。

像这样:.+(?=green)|(?<=green).+

在此处测试正则表达式:https://regex101.com/r/T8ULn0/1

.+(?=green)   match everything that precedes 'green'
|             OR
(?<=green).+  match everything that follows 'green'

这是JS代码:

let s = "red blue green purple"
let pattern = /.+(?=green)|(?<=green).+/gm
console.log(s.match(pattern))