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

时间:2011-10-18 01:44:44

标签: .net regex

我正在尝试整理一个正则表达式来查找字符串中存在的特定单词。具体来说,我想知道何时不存在“trunk”,“tags”或“branches”(这是Subversion预提交钩子)。基于Regular expression to match string not containing a word答案,我可以使用负面外观轻松地为一个单词执行此操作:

^((?!trunk).)*$

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

这在.NET中运行良好,只需一个字:

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

如果在第二行的路径中不存在“trunk”,它将返回false,因为它当前或是真的。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:71)

使用否定look-ahead断言输入中某处缺少三个单词中的任何一个:

^(?!.*(trunk|tags|branches)).*$

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

答案 1 :(得分:3)

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

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

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

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

所以写

会更好
var exp = new Regex(@"\b(trunk|tags|branches)\b");

但如果你真的需要一个负面的表情,并跟上ass原则

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

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

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

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

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