我知道以下正则表达式将匹配“红色”,“绿色”或“蓝色”。
red|green|blue
是否有一种简单的方法可以使它匹配除几个指定字符串以外的所有内容?
if (!s.match(/red|green|blue/)) ...
注意:我知道OP没有指定哪种语言/框架,因此前面的示例应视为通用示例,而不是说明性示例。
我知道以下正则表达式将匹配“红色”,“绿色”或“蓝色”。
red|green|blue
是否有一种简单的方法可以使它匹配除几个指定字符串以外的所有内容?
if (!s.match(/red|green|blue/)) ...
注意:我知道OP没有指定哪种语言/框架,因此前面的示例应视为通用示例,而不是说明性示例。
Answers:
如果要确保该字符串既不是红色,绿色也不是蓝色,那么caskey的答案就是这样。但是,通常需要确保该行的任何位置都不包含红色,绿色或蓝色。为此,将正则表达式与锚定^
并包含.*
在否定的lookahead中:
^(?!.*(red|green|blue))
另外,假设您想要包含单词“ engine”但没有任何这些颜色的行:
^(?!.*(red|green|blue)).*engine
您可能会认为可以.*
将正则表达式的开头作为因素:
^.*(?!red|green|blue)engine # Does not work
但是你不能。您必须同时具有两个实例.*
才能正常工作。
取决于语言,但是通常可以这样输入否定断言:
(?!red|green|blue)
(感谢语法修复,以上是有效的Java和Perl,YMMV)
如果要匹配整个字符串,则要匹配除某些字符串以外的所有字符串,您可以这样做:
^(?!(red|green|blue)$).*$
也就是说,从无法开始的字符串开头开始匹配,并以红色,绿色或蓝色结束,然后将其他任何内容匹配到字符串结尾。
您可以在这里尝试: https //regex101.com/r/rMbYHz/2
请注意,这仅适用于支持否定超前的正则表达式引擎。
您不需要负面的前瞻。有工作示例:
/([\s\S]*?)(red|green|blue|)/g
描述:
[\s\S]
-匹配任何字符*
-从0匹配到上一组的无限制?
-尽可能少地匹配(red|green|blue|)
-匹配其中一个单词,否则不匹配g
-重复图案例:
whiteredwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhiteredwhite
将会:
whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite
测试一下: regex101.com
匹配除模式之外的任何文本通常可以通过使用正则表达式模式分割字符串来实现。
例子:
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)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演示。注意:如果您的模式包含捕获组,则正则表达式拆分功能/方法的行为可能有所不同,这还取决于其他选项。请随后参考适当的拆分方法文档。
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);