正则表达式只匹配两个单词

时间:2011-07-26 13:33:51

标签: .net regex regex-negation

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

任何帮助都将非常感谢!

澄清:

我希望匹配任何不完全foo或bar的东西。

3 个答案:

答案 0 :(得分:75)

回答问题:“正则表达式匹配任何不是”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

答案 1 :(得分:19)

回答问题:“如何向this critera添加第二个字?”

您链接的问题的答案是:

^((?!word).)*$

其中(?!word)是否定前瞻。这个问题的答案是:

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

适用于这两个词。注意:如果您有多行并希望匹配每一行,则应启用全局多行选项,作为另一个问题。

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

有关详细说明,请参阅this answer

答案 2 :(得分:8)

我得到了你想要做的,但你想要阻止/允许的细节有点不清楚。例如,您是否要阻止任何非完全 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"