blahfooblah
と一致するがblahfoobarblah
とは一致しない正規表現が必要です
Barが後に続かない限り、fooとfooの周りのすべてにのみ一致するようにします。
私はこれを使用してみました:foo.*(?<!bar)
これはかなり近いですが、blahfoobarblah
と一致します。背後のネガティブな見方は、バーだけでなく、あらゆるものと一致する必要があります。
私が使用している特定の言語は、Clojureで、Java内部で正規表現を使用しています。
編集:より具体的には、blahfooblahfoobarblah
ではなくblahfoobarblahblah
を渡す必要もあります。
/(?!.*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
foo
で始まらない何かが続くbar
に一致させるには、試してください
foo(?!bar)
ネガティブな後読みを使用したバージョンは、「foo
の後にbar
で終わらないものが続く」と効果的に一致します。 .*
はbarblah
のすべてに一致し、(?<!bar)
はlah
を振り返り、bar
と一致しないことを確認しますが、一致しないため、パターン全体が一致します。
代わりに否定的な先読みを使用します。
\s*(?!\w*(bar)\w*)\w*(foo)\w*\s*
これは私のために働いた、それが役立つことを願っています。幸運を!
文字列全体ではなく、文字列内のすべての単語と一致するように動作することを提案するコメントを書きました。
これらすべてをコメントでつぶすのではなく、新しい回答として投稿しています。
/(?=\w*foo(?!bar))(\w+)/
foowithbar fooevenwithfoobar notfoobar foohere notfoobarhere butfooisokherebar notfoobarhere andnofuu needsfoo
foowithbar fooevenwithfoobar foohere butfooisokherebar needsfoo
特定の一致リクエストは次の方法で照合できます。
_\w+foo(?!bar)\w+
_
これはblahfooblahfoobarblah
と一致しますが、blahfoobarblahblah
とは一致しません。
foo.*(?<!bar)
の正規表現の問題は、foo
の後の_.*
_です。 bar
の後の文字を含む任意の文字と一致します。