我知道下面的正则表达式将匹配“ red ”、“ green ”或“ blue ”。
red|green|blue
有没有一种直接的方法让它匹配所有的东西__几个指定的字符串?
这取决于语言,但通常您可以像这样输入否定断言:
(?!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]
*
?
(red|green|blue|)
g
示例:
whiteredwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhiteredwhite
将是:
whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite
测试它:regex101.com
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))
text.split(/red|green|blue/)
text.split(/red|green|blue/).filter(Boolean)
text.split("red|green|blue")
text.split("red|green|blue", -1)
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").filter(_.nonEmpty)
.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)
注意:如果模式包含捕获组,则正则表达式拆分函数/方法可以的行为也会有所不同,这也取决于其他选项。请参考相应的拆分方法文档。