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


118

我知道以下正则表达式将匹配“红色”,“绿色”或“蓝色”。

red|green|blue

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


1
并非所有形式的正则表达式都可以做到这一点。您在什么环境工作?Java的?Perl?。净?一些C / C ++正则表达式库?RDBMS?
FrustratedWithFormsDesigner 2010年

8
您没有说您想要什么,但是您可以简单地反转“匹配”操作的含义。如果您尝试对不匹配的部分进行提取,这将无济于事,但要测试是否不存在排除的字符串,它会起作用:if (!s.match(/red|green|blue/)) ... 注意:我知道OP没有指定哪种语言/框架,因此前面的示例应视为通用示例,而不是说明性示例。
tvanfosson

Answers:


152

如果要确保该字符串既不是红色,绿色也不是蓝色,那么caskey的答案就是这样。但是,通常需要确保该行的任何位置都不包含红色,绿色或蓝色。为此,将正则表达式与锚定^并包含.*在否定的lookahead中:

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

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

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

您可能会认为可以.*将正则表达式的开头作为因素:

^.*(?!red|green|blue)engine     # Does not work

但是你不能。您必须同时具有两个实例.*才能正常工作。


48

取决于语言,但是通常可以这样输入否定断言:

(?!red|green|blue)

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


2
@caskey,完整的答案是我和你的结合。如果您想将它们合并在一起,我将删除我的。
韦恩·康拉德

13
如果您稍作解释,此答案将更加有用。例如:“”是什么?和“!” 意思?为什么需要捕获组?
2014年

这也是有效的Python。
乔·莫宁

刚与Delphi regEx库一起使用,它只能像这样:^(?! red | green | blue)。在regex101.com上测试它也适用。那么上面的错字是不是缺少^,还是真的像Java / Perl / Python中的那样工作呢?
彼得

32

匹配除给定字符串外的任何内容

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

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

也就是说,从无法开始的字符串开头开始匹配,并以红色,绿色或蓝色结束,然后将其他任何内容匹配到字符串结尾。

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

请注意,这仅适用于支持否定超前的正则表达式引擎。


23

您不需要负面的前瞻。有工作示例:

/([\s\S]*?)(red|green|blue|)/g

描述:

  • [\s\S] -匹配任何字符
  • * -从0匹配到上一组的无限制
  • ? -尽可能少地匹配
  • (red|green|blue|) -匹配其中一个单词,否则不匹配
  • g -重复图案

例:

whiteredwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhiteredwhite

将会:

whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite

测试一下: regex101.com


4
通过将[\ s \ S]换成一个点,可以大大减少步数。我很困惑,为什么似乎每个其他示例都单独捕获每个单词。这种方法稍微多了一些正则表达式步骤,但是所需的后处理却少得多。
Zatronium

3
但这不做匹配(文本验证),只是在替换过程中删除了指定的文本。
Marek R

此解决方案不会在已知单词之后输出最后的文本块。因此,没有必要比较速度,这是错误的。
Wiktor Stribi Wiew

@WiktorStribiżew固定。
hlcs

10

我有一个相同的问题,提出的解决方案几乎可以解决问题,但它们存在一些问题。最后,我使用的正则表达式是:

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

我在Javascript和.NET中对其进行了测试。

。*不应这样放置在否定的反色内部:^(?!。* red | green | blue),否则会使第一个元素的行为与其余元素不同(即,“ anotherred”在“ anothergreen”将)


3

匹配除模式之外的任何文本通常可以通过使用正则表达式模式分割字符串来实现。

例子

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

注意:如果您的模式包含捕获组,则正则表达式拆分功能/方法的行为可能有所不同,这还取决于其他选项。请随后参考适当的拆分方法文档。


0

除单词“ red”外的所有单词

var href = '(text-1) (red) (text-3) (text-4) (text-5)';

var test = href.replace(/\((\b(?!red\b)[\s\S]*?)\)/g, testF); 

function testF(match, p1, p2, offset, str_full) {
  p1 = "-"+p1+"-";
  return p1;
}

console.log(test);

除单词“ red”外的所有单词

var href = '(text-1) (frede) (text-3) (text-4) (text-5)';

var test = href.replace(/\(([\s\S]*?)\)/g, testF); 

function testF(match, p1, p2, offset, str_full) {
  p1 = p1.replace(/red/g, '');
  p1 = "-"+p1+"-";
  return p1;
}

console.log(test);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.