他の特定の部分文字列が後に続かない部分文字列に一致する正規表現


115

一致するが一致しblahfooblahない正規表現が必要blahfoobarblah

fooの後にのみbarが続かない限り、fooとfooの周りのすべてに一致するようにします。

私はこれを使ってみました:foo.*(?<!bar)これはかなり近いですが、と一致しblahfoobarblahます。後ろ向きの否定的な見方は、単なるバーではなく、何かと一致する必要があります。

私が使用している特定の言語は、内部でJava正規表現を使用するClojureです。

編集:より具体的には、パスする必要blahfooblahfoobarblahがありblahfoobarblahblahますが、パスしません。


1
foo。*(?<!bar。*)を使用してみましたか?
Thibault Falise、2010

回答:


158

試してください:

/(?!.*bar)(?=.*foo)^(\w+)$/

テスト:

blahfooblah            # pass
blahfooblahbarfail     # fail
somethingfoo           # pass
shouldbarfooshouldfail # fail
barfoofail             # fail

正規表現の説明

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    bar                      'bar'
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    foo                      'foo'
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    \w+                      word characters (a-z, A-Z, 0-9, _) (1 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string

その他の正規表現

bar直後の場合のみ除外したい場合はfoo

/(?!.*foobar)(?=.*foo)^(\w+)$/

編集する

具体的にするために質問を更新しました。

/(?=.*foo(?!bar))^(\w+)$/

新しいテスト

fooshouldbarpass               # pass
butnotfoobarfail               # fail
fooshouldpassevenwithfoobar    # pass
nofuuhere                      # fail

新しい説明

(?=.*foo(?!bar))が確実にfoo検出されるが、直接追跡されないbar


これは非常に近く、非常に良い答えです。私は十分に具体的ではないことを知っていました。:(私はこの必要があります。これが可能であるならば、このblahfoobarmeowwoofないので寂しい「foo」というの合格するために、「blahfoomeowwoof / foob​​arに/」を、しかし
レイン

余談ですが、「ボッター」ではなく「ボット」のようなものとどのように一致させるのでしょうか。
レイン、

はい。私は今持っているものを使うことができますが、ボッターだけではなくボッターとはマッチできればもっと簡単でしょう。私は非常に申し訳ない。私は正規表現に慣れていないので、自分が何を求めているのかをゆっくりと理解していると思います。:p
レイン2010

1
@Rayne、これは同じ質問です。上記の例では、一致させたいfooが、そうではなかったとしfoobarます。一致するbotが一致しないbotters場合は、を使用します/(?=.*bot(?!ters))^(\w+)$/
マセック

まあ、私は全体的に言葉全体を目指していました。私が言ったように、私は本当に欲しいものと本当に可能なことについて混乱しています。このようにするとうまくいきます。お時間ありがとうございます。:)
レイン、

55

fooで始まらないものでフォローを照合するにはbar

foo(?!bar)

否定的な後読みのあるバージョンは、実質的に「末尾が一致fooしない後に続くものに一致するbar」です。.*試合全てのbarblah、そして(?<!bar)ルックスバックでlah、それが一致していないことを確認しbar、それがないので、全体のパターンが一致しました。


したがって、「sid」が後に続かない限り、「did you」という文字列に一致するように設計された正規表現に対してこれを試しました。たとえば、「あなたが言った」と「あなたが考えた」とを区別するときに機能しますが、「それだけ」だけではキャプチャされません。助言がありますか?
soosus

2

代わりに否定的な先読みを使用してください:

\s*(?!\w*(bar)\w*)\w*(foo)\w*\s*

これは私にとってうまくいきました、それが役に立てば幸いです。幸運を!


シンプルでありながら効果的な正規表現。繰り返し文字列( "foofoo")を除外するためにも機能します。パーフェクト!
JonasByström、2014年

1

文字列全体ではなく、文字列内のすべての単語に一致するようにするには、このように提案するコメントを書きました。

これらすべてをコメントでつぶすのではなく、新しい回答として投稿します。

新しい正規表現

/(?=\w*foo(?!bar))(\w+)/

サンプルテキスト

foowithbar fooevenwithfoobar notfoobar foohere notfoobarhere butfooisokherebar notfoobarhere andnofuu needsfoo

マッチ

foowithbar fooevenwithfoobar foohere butfooisokherebar needsfoo


0

特定の一致リクエストは、次の方法で照合できます。

\w+foo(?!bar)\w+

これは一致しますblahfooblahfoobarblahが一致しませんblahfoobarblahblah

あなたの正規表現の問題foo.*(?<!bar).*fooです。それはの後の文字を含むあらゆる文字と一致しbarます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.