我知道下面的正则表达式将匹配“red”、“绿色”或“blue”。
red|green|blue
有没有一种简单的方法可以让它匹配所有除了几个指定的字符串?
a6b3iqyw1#
如果你想确保字符串既不是红色,绿色也不是蓝色,caskey's answer就是它。然而,通常需要的是确保线条中的任何地方都不包含红色、绿色或蓝色。为此,锚正则表达式与^,并包括.*在负前瞻:
^
.*
^(?!.*(red|green|blue))
此外,假设您想要包含单词“engine”但不包含任何颜色的行:
^(?!.*(red|green|blue)).*engine
您可能认为可以将.*因子化到正则表达式的头部:
^.*(?!red|green|blue)engine # Does not work
但你不能您必须同时拥有.*的两个示例才能使其工作。
irtuqstp2#
取决于语言,但通常有否定Assert,你可以这样写:
(?!red|green|blue)
(感谢语法修复,以上是有效的Java和Perl,YMMV)
w7t8yxp53#
如果你想匹配整个字符串,而你想匹配除了某些字符串之外的所有字符串,你可以这样做:^(?!(red|green|blue)$).*$这意味着,从字符串的开头开始匹配,在那里它不能以红色,绿色或蓝色开始和结束,并将其他任何东西匹配到字符串的结尾。你可以在这里试试:https://regex101.com/r/rMbYHz/2请注意,这只适用于支持negative lookahead的正则表达式引擎。
^(?!(red|green|blue)$).*$
lkaoscv74#
你不需要消极的前瞻。有一个工作示例:
/([\s\S]*?)(red|green|blue|)/g
产品描述:
[\s\S]
*
?
(red|green|blue|)
g
范例:whiteredwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhiteredwhite将是:whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite测试它:regex101.com
whiteredwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhiteredwhite
whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite
regex101.com
vqlkdk9b5#
我也有同样的问题,提出的解决方案几乎是有效的,但他们有一些问题。最后我使用的正则表达式是:
^(?!red|green|blue).*
我在JavaScript和. NET中测试了它。.*不应该像这样放置在负前瞻中:^(?!.*red|green|blue),或者它会使第一个元素的行为与其他元素不同(即,“anotherred”不会匹配,而“anothergreen”会匹配)
^(?!.*red|green|blue)
vlju58qv6#
匹配任何文本,但那些匹配模式通常是通过 * 分裂 * 字符串与正则表达式模式**实现的。
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)
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);
7条答案
按热度按时间a6b3iqyw1#
如果你想确保字符串既不是红色,绿色也不是蓝色,caskey's answer就是它。然而,通常需要的是确保线条中的任何地方都不包含红色、绿色或蓝色。为此,锚正则表达式与
^
,并包括.*
在负前瞻:此外,假设您想要包含单词“engine”但不包含任何颜色的行:
您可能认为可以将
.*
因子化到正则表达式的头部:但你不能您必须同时拥有
.*
的两个示例才能使其工作。irtuqstp2#
取决于语言,但通常有否定Assert,你可以这样写:
(感谢语法修复,以上是有效的Java和Perl,YMMV)
w7t8yxp53#
匹配除给定字符串之外的任何内容
如果你想匹配整个字符串,而你想匹配除了某些字符串之外的所有字符串,你可以这样做:
^(?!(red|green|blue)$).*$
这意味着,从字符串的开头开始匹配,在那里它不能以红色,绿色或蓝色开始和结束,并将其他任何东西匹配到字符串的结尾。
你可以在这里试试:https://regex101.com/r/rMbYHz/2
请注意,这只适用于支持negative lookahead的正则表达式引擎。
lkaoscv74#
你不需要消极的前瞻。有一个工作示例:
产品描述:
[\s\S]
-匹配任何字符*
-匹配从0到无限从以前的组?
-尽可能少匹配(red|green|blue|)
-匹配其中一个单词或不匹配g
-重复模式范例:
whiteredwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhiteredwhite
将是:
whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite
测试它:
regex101.com
vqlkdk9b5#
我也有同样的问题,提出的解决方案几乎是有效的,但他们有一些问题。最后我使用的正则表达式是:
我在JavaScript和. NET中测试了它。
.*
不应该像这样放置在负前瞻中:^(?!.*red|green|blue)
,或者它会使第一个元素的行为与其他元素不同(即,“anotherred”不会匹配,而“anothergreen”会匹配)vlju58qv6#
匹配任何文本,但那些匹配模式通常是通过 * 分裂 * 字符串与正则表达式模式**实现的。
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的演示)text.split(/red|green|blue/)
(这里不需要使用g
修饰符!)(要摆脱空值,请使用text.split(/red|green|blue/).filter(Boolean)
),请参见演示text.split("red|green|blue")
,或-保留所有尾随的空项-使用text.split("red|green|blue", -1)
,或删除所有空项使用more code to remove them(参见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() }
删除空白项,请参见demotext.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)
,如果您需要删除空项目,请使用this code。参见Go demo。注意:如果您的模式包含capturing groups,则正则表达式拆分函数/方法may的行为会有所不同,这也取决于其他选项。请参考相应的拆分方法文档。
fykwrbwg7#
除了“红色”以外的所有内容
除了“红色”以外的所有内容