webdevqa.jp.net

2つの単語以外に一致する正規表現

「foo」や「bar」以外のものに一致する正規表現を作成しようとしています。 単語を含まない行に一致する正規表現? で1つの単語以外のものと一致する方法を見つけましたが、正規表現にあまり熟練していないため、2番目の単語を追加する方法がわかりませんこの基準に。

どんな助けでも大歓迎です!

明確化:

Fooやbarだけではないものにマッチさせたかった。

33
goombaloon

質問への回答:「「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を設定する必要があるかもしれません。

75
Tim Pietzcker

質問への回答:「2番目の単語を this critera ?に追加する方法」

リンクする質問の答えは次のとおりです。

^((?!Word).)*$

どこ (?!Word)は負の先読みです。この質問に対する答えは次のとおりです。

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

両方の単語で機能します。注:複数の行があり、各行を一致させる場合は、globalおよびmultilineオプションを有効にする必要があります。その他の質問。

違いは、負の先読み句です:(?!wordone|wordtwo)。任意の(合理的な)量の単語または句に拡張できます。

詳細な説明については、 この回答 を参照してください。

19
Pindatjuh

あなたがしたいことはわかっていますが、ブロック/許可したいものの仕様は少し不明瞭です。たとえば、exactlyfooまたはbarではないものをブロックしますか?または、何かをブロックしますか含むこれら2つの文字列?

@Timのfoonlyまたはbartenderの例のように、それらを別の文字列の一部にすることはできますか?

各パターンを提案するだけです。

/^(?!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"
8
Justin Morgan