匹配指定字符串以外的所有内容

Alf*_*red 102 regex

我知道以下正则表达式将匹配"红色","绿色"或"蓝色".

red|green|blue
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法使它匹配除了几个指定字符串之外的所有内容?

Way*_*rad 135

如果你想确保字符串既不是红色,绿色也不是蓝色,那么caskey的答案就是它.然而,通常需要的是确保线条中的任何位置都不包含红色,绿色或蓝色.为此,将正则表达式锚定^并包含.*在否定前瞻中:

^(?!.*(red|green|blue))
Run Code Online (Sandbox Code Playgroud)

另外,假设您想要包含单词"engine"但没有任何颜色的行:

^(?!.*(red|green|blue)).*engine
Run Code Online (Sandbox Code Playgroud)

您可能认为可以.*将正则表达式的头部考虑在内:

^.*(?!red|green|blue)engine     # Does not work
Run Code Online (Sandbox Code Playgroud)

但你不能.你必须有两个实例.*才能工作.

  • 需要指出的是,前瞻不是 BRE(基本)或 ERE(扩展)正则表达式的一部分。您需要 PCRE(Perl 兼容)或类似的。------ 你的最后一个例子不起作用,因为开头的贪婪的 `.*` 将匹配任何内容。您需要使初始匹配更加具体。例如仅匹配空格: `printf 'redengine\nblackengine\ngreenengine\n' | grep -P '^\s*(?!red|green|blue)\w*engine'` (4认同)

cas*_*key 41

取决于语言,但通常会有负面断言,如下所示:

(?!red|green|blue)
Run Code Online (Sandbox Code Playgroud)

(感谢语法修复,上面是有效的Java和Perl,YMMV)

  • 如果您稍微解释一下,这个答案会更有用.例如:"做什么?" 和"!" 意思?你为什么需要捕获组? (11认同)
  • @caskey,完整的答案是我和您的结合。如果您想将它们合并在一起,我将删除我的。 (2认同)
  • 我很好奇@Lii评论的答案 (2认同)

Sam*_*Sam 26

匹配任何东西,但给定字符串

如果你想匹配你想要匹配除了某些字符串之外的所有字符串的整个字符串,你可以这样做:

^(?!(red|green|blue)$).*$

这就是说,从字符串的开头开始匹配,它不能以红色,绿色或蓝色开始和结束,并匹配字符串末尾的任何其他内容.

你可以在这里试试:https://regex101.com/r/rMbYHz/2

请注意,这仅适用于支持负向前瞻的正则表达式引擎.


hlc*_*lcs 21

你不需要消极的前瞻.有工作的例子:

/([\s\S]*?)(red|green|blue)/g
Run Code Online (Sandbox Code Playgroud)

描述:

  • [\s\S] - 匹配任何角色
  • * - 从前一组的0到无限制匹配
  • ? - 尽可能少地匹配
  • (red|green|blue) - 匹配其中一个词
  • g - 重复模式

例:

redwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhitered

将会:

whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite

测试一下: regex101.com

采取1155步骤,但如果有人可以改善我会受到赞赏.

  • 您可以通过交换点的[\ s\S]来大幅减少步数.我很困惑为什么看似每个其他例子都单独捕获每个单词.这种方式稍微多于正则表达式步骤,但后处理要少得多. (4认同)
  • 但这不进行匹配(文本验证),它只是在替换过程中删除了指定的文本。 (2认同)

Dur*_*n81 11

我有同样的问题,提出的解决方案几乎可以工作,但他们有一些问题.最后我使用的正则表达式是:

^(?!red|green|blue).*
Run Code Online (Sandbox Code Playgroud)

我在Javascript和.NET中测试过它.

.*不应该放在负面的前瞻内部,如下所示:^(?!.*red | green | blue)或者它会使第一个元素的行为与其余元素不同(即"anotherred"不会匹配,而"另一个"会"


Wik*_*żew 7

匹配任何文本,但那些匹配模式的文本通常是通过使用正则表达式模式拆分字符串来实现的。

例子

  • -Regex.Split(text, @"red|green|blue")或者,摆脱空值,Regex.Split(text, @"red|green|blue").Where(x => !string.IsNullOrEmpty(x))(见演示
  • -Regex.Split(text, "red|green|blue")或者,删除空项目,Regex.Split(text, "red|green|blue").Where(Function(s) Not String.IsNullOrWhitespace(s))(参见演示,或支持 LINQ 的演示
  • - text.split(/red|green|blue/)g这里不需要使用修饰符!)(为了摆脱空值,使用text.split(/red|green|blue/).filter(Boolean)),见演示
  • - text.split("red|green|blue"), 或 - 保留所有尾随空项 - 使用text.split("red|green|blue", -1),或删除所有空项使用更多代码来删除它们(参见演示
  • - 与 Java 类似text.split(/red|green|blue/),用于获取所有尾随项​​使用text.split(/red|green|blue/, -1)并删除所有空项使用text.split(/red|green|blue/).findAll {it != ""})(参见演示
  • -text.split(Regex("red|green|blue"))或者,要删除空白项,请使用text.split(Regex("red|green|blue")).filter{ !it.isBlank() },请参阅演示
  • - text.split("red|green|blue"),或保留所有尾随空项目,使用text.split("red|green|blue", -1)并删除所有空项目,使用text.split("red|green|blue").filter(_.nonEmpty)(见演示
  • - text.split(/red|green|blue/),摆脱空值使用.split(/red|green|blue/).reject(&:empty?)(并获得前导和尾随空项目,-1用作第二个参数,.split(/red|green|blue/, -1))(见演示
  • - my @result1 = split /red|green|blue/, $text;,或带有所有尾随空项my @result2 = split /red|green|blue/, $text, -1;,或不带任何空项,my @result3 = grep { /\S/ } split /red|green|blue/, $text;(参见演示
  • -preg_split('~red|green|blue~', $text)preg_split('~red|green|blue~', $text, -1, PREG_SPLIT_NO_EMPTY)不输出空项目(见演示
  • -re.split(r'red|green|blue', text)或者,删除空项目,list(filter(None, re.split(r'red|green|blue', text)))(见演示
  • - 使用regexp.MustCompile("red|green|blue").Split(text, -1),如果您需要删除空项目,请使用此代码。请参阅Go 演示

注意:如果您的模式包含捕获组,正则表达式拆分函数/方法的行为可能会有所不同,这也取决于其他选项。请参考相应的拆分方法文档。