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

iyfamqjs  于 2023-10-22  发布在  其他
关注(0)|答案(7)|浏览(102)

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

red|green|blue

有没有一种简单的方法可以让它匹配所有除了几个指定的字符串?

a6b3iqyw

a6b3iqyw1#

如果你想确保字符串既不是红色,绿色也不是蓝色,caskey's answer就是它。然而,通常需要的是确保线条中的任何地方都不包含红色、绿色或蓝色。为此,锚正则表达式与^,并包括.*在负前瞻:

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

此外,假设您想要包含单词“engine”但不包含任何颜色的行:

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

您可能认为可以将.*因子化到正则表达式的头部:

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

但你不能您必须同时拥有.*的两个示例才能使其工作。

irtuqstp

irtuqstp2#

取决于语言,但通常有否定Assert,你可以这样写:

(?!red|green|blue)

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

w7t8yxp5

w7t8yxp53#

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

如果你想匹配整个字符串,而你想匹配除了某些字符串之外的所有字符串,你可以这样做:
^(?!(red|green|blue)$).*$
这意味着,从字符串的开头开始匹配,在那里它不能以红色,绿色或蓝色开始和结束,并将其他任何东西匹配到字符串的结尾。
你可以在这里试试:https://regex101.com/r/rMbYHz/2
请注意,这只适用于支持negative lookahead的正则表达式引擎。

lkaoscv7

lkaoscv74#

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

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

产品描述:

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

范例:
whiteredwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhiteredwhite
将是:
whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite
测试它:regex101.com

vqlkdk9b

vqlkdk9b5#

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

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

我在JavaScript和. NET中测试了它。
.*不应该像这样放置在负前瞻中:^(?!.*red|green|blue),或者它会使第一个元素的行为与其他元素不同(即,“anotherred”不会匹配,而“anothergreen”会匹配)

vlju58qv

vlju58qv6#

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

  • 示例 *:
  • c#-Regex.Split(text, @"red|green|blue")Regex.Split(text, @"red|green|blue").Where(x => !string.IsNullOrEmpty(x)),以消除空值(参见demo
  • vb.net-Regex.Split(text, "red|green|blue")Regex.Split(text, "red|green|blue").Where(Function(s) Not String.IsNullOrWhitespace(s))(要删除空项目,请参阅demo或支持LINQ的演示)
  • javascript-text.split(/red|green|blue/)(这里不需要使用g修饰符!)(要摆脱空值,请使用text.split(/red|green|blue/).filter(Boolean)),请参见演示
  • java-text.split("red|green|blue"),或-保留所有尾随的空项-使用text.split("red|green|blue", -1),或删除所有空项使用more code to remove them(参见demo
  • groovy-类似于Java,text.split(/red|green|blue/),使用text.split(/red|green|blue/, -1)获取所有尾随项,使用text.split(/red|green|blue/).findAll {it != ""})删除所有空项(参见demo
  • kotlin-text.split(Regex("red|green|blue")),或使用text.split(Regex("red|green|blue")).filter{ !it.isBlank() }删除空白项,请参见demo
  • scala-text.split("red|green|blue"),或者要保留所有尾随的空项,请使用text.split("red|green|blue", -1),要删除所有空项,请使用text.split("red|green|blue").filter(_.nonEmpty)(请参见demo
  • ruby-text.split(/red|green|blue/),使用.split(/red|green|blue/).reject(&:empty?)去除空值(要同时获得前导和尾随的空项,使用-1作为第二个参数,.split(/red|green|blue/, -1))(参见demo
  • perl-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
  • php-preg_split('~red|green|blue~', $text)preg_split('~red|green|blue~', $text, -1, PREG_SPLIT_NO_EMPTY)以不输出空项目(参见demo
  • python-re.split(r'red|green|blue', text),或者,删除空项目,list(filter(None, re.split(r'red|green|blue', text)))(参见demo
  • go-使用regexp.MustCompile("red|green|blue").Split(text, -1),如果您需要删除空项目,请使用this code。参见Go demo
    注意:如果您的模式包含capturing groups,则正则表达式拆分函数/方法may的行为会有所不同,这也取决于其他选项。请参考相应的拆分方法文档。
fykwrbwg

fykwrbwg7#

除了“红色”以外的所有内容

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

相关问题