我知道以下正则表达式将匹配“红色”,“绿色”或“蓝色”。
red|green|blue
是否有一种简单的方法可以匹配除了几个指定字符串之外的所有内容?
答案 0 :(得分:118)
如果你想确保字符串既不是红色,绿色也不是蓝色,那么caskey的答案就是它。然而,通常需要的是确保线条中的任何位置都不包含红色,绿色或蓝色。为此,使用^
锚定正则表达式,并在否定前瞻中包含.*
:
^(?!.*(red|green|blue))
另外,假设您想要包含单词“engine”但没有任何颜色的行:
^(?!.*(red|green|blue)).*engine
您可能认为可以将.*
计算到正则表达式的开头:
^.*(?!red|green|blue)engine # Does not work
但你不能。您必须同时拥有.*
的两个实例才能生效。
答案 1 :(得分:36)
取决于语言,但通常会出现负面断言,如下所示:
(?!red|green|blue)
(感谢语法修复,上面是有效的Java和Perl,YMMV)
答案 2 :(得分:19)
如果你想匹配除了某些字符串之外的所有字符串,你可以这样做:
^(?!(red|green|blue)$).*$
这就是说,从字符串的开头开始匹配,它不能以红色,绿色或蓝色开始和结束,并匹配字符串末尾的任何其他内容。
您可以在此处试用:https://regex101.com/r/rMbYHz/2
请注意,这仅适用于支持negative lookahead的正则表达式引擎。
答案 3 :(得分:17)
你不需要消极的向前看。有工作的例子:
/([\s\S]*?)(red|green|blue)/g
说明
[\s\S]
- 匹配任何字符*
- 从0到上一组的无限制匹配?
- 尽可能少地匹配(red|green|blue)
- 匹配其中一个g
- 重复模式示例:
redwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhitered
将是:
whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite
测试它:regex101.com
采取1155步骤,但如果有人可以提高,我将不胜感激。
答案 4 :(得分:10)
我有同样的问题,所提出的解决方案几乎正在运作,但他们遇到了一些问题。最后我使用的正则表达式是:
^(?!red|green|blue).*
我在Javascript和.NET中测试过它。
。*不应该像这样放在负面的前瞻中:^(?!。* red | green | blue)或者它会使第一个元素的行为与其余元素不同(即“anotherred”不会是匹配而“另一个绿色”会)
答案 5 :(得分:5)
匹配任何文本但匹配模式的文本通常是通过 用正则表达式模式分割字符串来实现的。
示例:
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或this demo,其中支持LINQ)text.split(/red|green|blue/)
(此处无需使用g
修饰符!)(要摆脱空值,请使用text.split(/red|green|blue/).filter(Boolean)
),请参见demo 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() }
,请参见demo 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
作为第二个参数,{ {1}})(请参阅demo).split(/red|green|blue/, -1)
,或者包含所有结尾的空项目my @result1 = split /red|green|blue/, $text;
,或者不包含任何空项目,my @result2 = split /red|green|blue/, $text, -1;
(请参阅demo)my @result3 = grep { /\S/ } split /red|green|blue/, $text;
或preg_split('~red|green|blue~', $text)
不输出空项目(请参见demo)preg_split('~red|green|blue~', $text, -1, PREG_SPLIT_NO_EMPTY)
,或者要删除空白项目,请re.split(r'red|green|blue', text)
(请参阅demo)list(filter(None, re.split(r'red|green|blue', text)))
,如果需要删除空白项目,请使用this code。参见Go demo。注意:如果您的模式包含capturing groups,则正则表达式拆分函数/方法may的行为会有所不同,具体取决于其他选项。然后,请参阅相应的拆分方法文档。
答案 6 :(得分:0)
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);