正则表达式排除关键字集
我想要一个表达式,当遇到诸如" boon.ini"和" http"之类的单词时会失败。目标是采用该表达式并能够为任何关键字集构造。
解决方案
而不是在表达式中求结果,而应该在代码中进行。这样,表达式就变得非常简单。
\b(boon\.ini|http)\b
如果boon.ini或者http在字符串中的任何位置,则将返回true
。由于\ b
或者单词边界,它不会匹配httpd或者httpxyzzy之类的单词。如果需要,我们可以删除它们,它也将与之匹配。要添加更多关键字,只需添加更多管道。
\b(boon\.ini|http|foo|bar)\b
^(?:(?!boon\.ini|http).)*$\r?\n?
(取自RegexBuddy的库)将匹配不包含boon.ini和/或者http的任何行。那是你想要的吗?
编写一个正则表达式可能会很好地为我们服务,当它遇到我们要查找的单词时会成功,然后反转条件。
例如,在perl中,我们将使用:
if (!/boon\.ini|http/) { # the string passed! }
哪种语言/正则表达式库?我以为问题是关于ASP.NET的,在这种情况下,我们可以看到本文的"负头"部分:
http://msdn.microsoft.com/en-us/library/ms972966.aspx
严格来说,对正则表达式的否定仍然定义了正则语言,但是很少有库/语言/工具可以表达它。
负lookahed可以为我们提供相同的服务,但实际语法取决于我们使用的内容。蒂姆的答案是一个带有((?...)`
可以使用的替代表达式:
^(?!.*IgnoreMe).*$
^
=表示行首
$表示行尾(?!Expression)
=表示表达式上的零宽度前瞻负匹配
需要在最前面加上" ^",否则在进行负面评估时,可能会从" IgnoreMe"文本内/外的某处开始,并在不需要的地方进行匹配。
例如如果使用正则表达式:
(?!.*IgnoreMe).*$
使用输入" Hello IgnoreMe Please",这将导致类似于:" gnoreMe Please",因为前面的否定式查找发现在" I"之后没有完整的字符串" IgnoreMe"。
^[^£]*$
上面的表达式将仅限制字符串中的井号。这将允许除字符串以外的所有字符。