【问题标题】:Regex to match anything but two words正则表达式匹配除两个单词之外的任何内容
【发布时间】:2011-10-13 10:24:27
【问题描述】:

我正在尝试编写一个正则表达式来匹配任何不是“foo”和“bar”的东西。我在Regular expression to match a line that doesn't contain a word? 找到了除了一个词之外的任何内容,但我对正则表达式不是很熟练,并且不确定如何在这个标准中添加第二个词。

任何帮助将不胜感激!

澄清:

我想匹配任何不完全是 foo 或 bar 的东西。

【问题讨论】:

  • 那不是“foo”或“bar”吗?或者任何不包含“foo”和“bar”的东西?
  • 您想如何处理包含这两个单词之一以及其他字符的字符串?例如,应该允许blah blah foo blah blah 吗?

标签: .net regex regex-negation


【解决方案1】:

回答问题:“一个正则表达式来匹配任何不是“foo”和“bar”的东西?”

^(?!foo$|bar$).*

确实会这样做。

^      # Start of string
(?!    # Assert that it's impossible to match...
 foo   # foo, followed by
 $     # end of string
|      #
 bar$  # bar, followed by end of string.
)      # End of negative lookahead assertion
.*     # Now match anything

如果您的字符串可以包含您也希望匹配的换行符,您可能需要设置RegexOptions.Singleline

【讨论】:

  • 只有当整个字符串都是单词之一时才会触发。目前尚不清楚 OP 是否希望这样做,但值得指出。
  • 对问题的第一个“部分”的一个很好的回答:“匹配任何不是 foo 和 bar 的东西的正则表达式。”
【解决方案2】:

回答问题:“如何在this critera 中添加第二个词?”

您链接到的问题的答案是:

^((?!word).)*$

(?!word) 是一个负前瞻。这个问题的答案是:

^((?!wordone|wordtwo).)*$

对这两个词都有效。注意:您应该启用 globalmultiline 选项,如果您有多行并且想要匹配每一行,就像另一个问题一样。

不同之处在于否定的前瞻子句:(?!wordone|wordtwo)。它可以扩展到任何(合理)数量的单词或从句。

详情请见this answer

【讨论】:

  • 这将无法匹配 foonlybartender(甚至任何仅包含 foobar 的单词),这不是 goombaloon 想要的。
  • @Tim Pietzcker:不同的解释。如果他打算扩展他所指问题的答案,那么这有效:它不会匹配包含“foo”或“bar”或两者的任何内容。
【解决方案3】:

我知道您想要做什么,但是您想要阻止/允许的细节有点不清楚。例如,您是否要阻止任何不完全 foobar 的内容?或者您想阻止任何包含这两个字符串的内容?

它们是否可以是另一个字符串的一部分,例如 @Tim 的 foonlybartender 示例?

我只是为每一个建议模式:

/^(?!foo$|bar$).*/   #credit to @Tim Pietzcker for this one, he did it first
    #blocks "foo"
    #blocks "bar"
    #allows "hello goodbye"
    #allows "hello foo goodbye"
    #allows "foogle"
    #allows "foobar"

/^(?!.*foo|.*bar).*$/
    #blocks "foo"
    #blocks "bar"
    #allows "hello goodbye"
    #blocks "hello foo goodbye"
    #blocks "foogle"
    #blocks "foobar"

/^(?!.*\b(foo|bar)\b).*$/
    #blocks "foo"
    #blocks "bar"
    #allows "hello goodbye"
    #blocks "hello foo goodbye"
    #allows "foogle"
    #allows "foobar"

【讨论】:

    猜你喜欢
    • 2019-11-12
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    相关资源
    最近更新 更多