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

我知道下面的正则表达式将匹配“ red ”、“ green ”或“ blue ”。

red|green|blue

有没有一种直接的方法让它匹配所有的东西__几个指定的字符串?

328939 次浏览

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

(?!red|green|blue)

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

如果要确保字符串既不是红色、绿色也不是蓝色,则卡斯基的回答。然而,通常需要的是确保线中的任何地方都不包含红色、绿色或蓝色。为此,使用^锚定正则表达式,并在否定预视中包括.*

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

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

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

您可能认为可以将.*分解到正则表达式的头部:

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

但你不能。您必须拥有.*的两个实例才能使其正常工作。

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

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

我在JavaScript和.NET中测试了它。

.*不应像这样放在反向预测中:^(?!.*red|green|blue),否则会使第一个元素的行为与其余元素不同(即“ AnotherRed ”不匹配,而“ AnotherGreen ”匹配)

你不需要消极的前瞻。有一个工作示例:

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

描述:

  • [\s\S]-匹配任意字符
  • *-上一组中从0到无限制的匹配
  • ?-匹配越少越好
  • (red|green|blue|)-匹配其中一个单词或不匹配任何内容
  • g-重复模式

示例:

whiteredwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhiteredwhite

将是:

whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite

测试它:regex101.com

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

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

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

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

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

请注意,这仅适用于支持负先行的正则表达式引擎。

除“红”字外

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);

除“红”字外

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);

通常使用使用regex模式拆分字符串来匹配除了与模式匹配的文本之外的任何文本。

例子

  • -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),如果需要删除空项,则使用这个代码。参见去演示

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