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

Posted

技术标签:

【中文标题】不包含多个特定单词的字符串的正则表达式【英文标题】:Regex for string not containing multiple specific words 【发布时间】:2011-12-09 17:41:11 【问题描述】:

我正在尝试组合一个正则表达式来查找特定单词何时存在于字符串中。具体来说,我想知道“主干”、“标签”或“分支”何时不存在(这是用于 Subversion 预提交挂钩)。根据Regular expression to match string not containing a word 的回答,我可以很容易地使用否定的环顾四周来为一个词做到这一点:

^((?!trunk).)*$

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

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

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

如果第二行的路径中不存在“trunk”,它将返回当前状态的 false 或 true。

我在这里错过了什么?

【问题讨论】:

你为什么不能只做一个普通的“搜索”正则表达式并反转结果呢? 我受限于只能编辑正则表达式,而不是周围的逻辑。 【参考方案1】:

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

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

我还稍微重新排列了您的正则表达式以纠正小错误。

【讨论】:

@S.Serp 因为向前看不会消耗输入,你必须在外面留下一些东西才能真正匹配。如果您将.* 移动到前瞻中,则只剩下^$,它实际上不匹配任何内容(即空白),加上匹配something 的前瞻,这是一个不可能。【参考方案2】:

使用“标准”匹配并查找!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");

但是如果你真的需要一个否定的lookahed表达式,并且跟上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

【讨论】:

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

以上是关于不包含多个特定单词的字符串的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式之特定场景不包含特定单词,如不包含hello

如何使用正则表达式,将字符串中的每个单词首字母大写

用正则表达式怎样匹配 不包含特定字符串的字符串

通过正则表达式删除嵌套在多个 html 标记中的特定单词

正则表达式包含某字符串且不包含某些字符串

正则表达式包含某字符串且不包含某些字符串