正则表达式不包含多个特定单词的字符串

Tro*_*unt 39 .net regex

我正在尝试整理一个正则表达式来查找字符串中存在特定单词的时间.具体来说,我想知道何时不存在"trunk","tags"或"branches"(这是Subversion预提交钩子).基于正则表达式匹配不包含单词答案的字符串,我可以使用负面外观轻松地为一个单词执行此操作:

^((?!trunk).)*$
Run Code Online (Sandbox Code Playgroud)

这是我正在努力的"和"运算符,我似乎无法获得包括其他两个单词在内的组合.

这在.NET中运行正常,只有一个单词:

var exp = new Regex(@"^((?!trunk).)*$");
exp.IsMatch("trunk/blah/blah");
Run Code Online (Sandbox Code Playgroud)

它将返回false,因为它当前或如果第二行路径中不存在"trunk",则返回true.

我在这里错过了什么?

Boh*_*ian 80

使用负向前瞻,断言输入中某处的三个单词中没有任何一个:

^(?!.*(trunk|tags|branches)).*$
Run Code Online (Sandbox Code Playgroud)

我还稍微重新安排了你的正则表达式来纠正小错误.

  • @S.Serp 因为向前看不会消耗输入,所以你必须在外面留下一些东西才能真正匹配。如果您将`.*` 移动到前瞻中,您将只剩下`^$`,它实际上什么都不匹配(即空白),再加上一个与*something* 匹配的前瞻,这是不可能的。 (3认同)

xan*_*tos 5

使用“标准”匹配并寻找!IsMatch

var exp = new Regex(@"trunk|tags|branches");
var result = !exp.IsMatch("trunk/blah/blah");
Run Code Online (Sandbox Code Playgroud)

为什么人们喜欢让自己的生活变得困难?

啊……记住ass原则!http://www.codinghorror.com/blog/2008/10/obscenity-filters-bad-idea-or-incredible-intercoursing-bad-idea.html

所以最好写

var exp = new Regex(@"\b(trunk|tags|branches)\b");
Run Code Online (Sandbox Code Playgroud)

但如果你真的需要一个消极的表情,并遵守ass原则

var exp = new Regex(@"^(?!.*\b(trunk|tags|branches)\b)";
Run Code Online (Sandbox Code Playgroud)

测试仪:http://gskinner.com/RegExr/ ?2uv1g

我会注意到,如果您正在寻找完整路径(由/或分隔的单词\),那么

var exp = new Regex(@"^(?!.*(^|\\|/)(trunk|tags|branches)(/|\\|$))";
Run Code Online (Sandbox Code Playgroud)

测试仪:http://gskinner.com/RegExr/ ?2uv1p

  • 谢谢,但不幸的是,这种情况下的约束需要在正则表达式中完成工作,我无法控制此之外的代码来反转条件。 (2认同)