【发布时间】:2010-09-12 02:56:25
【问题描述】:
我想要一个在遇到诸如“boon.ini”和“http”之类的词时会失败的表达式。我们的目标是采用这个表达式并能够为任何一组关键字进行构造。
【问题讨论】:
标签: regex regex-negation
我想要一个在遇到诸如“boon.ini”和“http”之类的词时会失败的表达式。我们的目标是采用这个表达式并能够为任何一组关键字进行构造。
【问题讨论】:
标签: regex regex-negation
^(?:(?!boon\.ini|http).)*$\r?\n?
(取自RegexBuddy 的库)将匹配任何不包含 boon.ini 和/或 http 的行。这是你想要的吗?
【讨论】:
可以使用的另一种表达方式:
^(?!.*IgnoreMe).*$
^ = 表示行首 $ = 表示行尾 (?! Expression) = 表示零宽度前瞻负匹配表达式
前面的^ 是必需的,否则在评估时,负面的前瞻性可能会从“IgnoreMe”文本内部/之外的某个地方开始 - 并在您不想要的地方进行匹配。
例如如果您使用正则表达式:
(?!.*IgnoreMe).*$
输入“Hello IgnoreMe Please”,这将导致类似:“gnoreMe Please”,因为否定的前瞻发现在“I”之后没有完整的字符串“IgnoreMe”。
【讨论】:
您应该在代码中执行此操作,而不是在表达式中否定结果。这样,表达式就变得非常简单了。
\b(boon\.ini|http)\b
如果 boon.ini 或 http 在您的字符串中的任何位置,将返回 true。由于 \b 或单词边界,它不会匹配 httpd 或 httpxyzzy 之类的单词。如果你愿意,你可以删除它们,它也会匹配它们。要添加更多关键字,只需添加更多管道即可。
\b(boon\.ini|http|foo|bar)\b
【讨论】:
编写一个正则表达式可能会为您提供很好的服务,当遇到您要查找的单词时成功,然后反转条件。
例如,在 perl 中你会使用:
if (!/boon\.ini|http/) {
# the string passed!
}
【讨论】:
^[^£]*$
上面的表达式将只限制字符串中的井号。这将允许除字符串之外的所有字符。
【讨论】:
哪种语言/正则表达式库?我以为你的问题是围绕 ASP.NET 的,在这种情况下你可以看到本文的“负面外观”部分: http://msdn.microsoft.com/en-us/library/ms972966.aspx
严格来说,正则表达式的否定,仍然定义了一种正则语言,但是很少有库/语言/工具可以表达它。
负向lookahed 可能为您提供相同的服务,但实际语法取决于您使用的内容。 Tim 的回答是(?...)
【讨论】:
我使用这个(基于 Tim Pietzcker 的回答)排除了 Google Analytics 配置文件过滤器的非生产子域 URL:
^\w+-*\w*\.(?!(?:alpha(123)*\.|beta(123)*\.|preprod\.)domain\.com).*$
您可以在此处查看上下文:Regex to Exclude Multiple Words
【讨论】: