次のように、否定的な先読みに入れることができます。
(?!mak(e|ing) ?it ?cheaper)
ただし、matches
1を実行すると、先を見ているだけなので一致しません。実際には何も一致しておらず、find
1を実行すると一致します。これは、次の文字が上記と一致しない文字列内の多くの場所から開始できるためです。
これを修正するには、目的に応じて 2 つの選択肢があります。
これらの文字列の 1 つであるすべての文字列を除外する場合(つまり、「安くする」は除外されません)、文字列の開始 ( ) と終了 ( ) を確認します^
。$
^(?!mak(e|ing) ?it ?cheaper$).*
( .*
0 個以上のワイルドカード) は、実際に行われるマッチングです。最初の文字からの否定先読みチェック。
それらのいずれかを含むすべての文字列を除外する場合は、一致するすべての文字の前に先読みが一致しないようにすることができます。
^((?!mak(e|ing) ?it ?cheaper).)*$
別の方法は、先読みの先頭にワイルドカードを追加することです(つまり、文字列の先頭から何かを含むすべての文字列を除外し、次にパターンを除外します)が、現在これには利点がありません(任意の長さの先読みも、特定のツールでサポートされる可能性が低くなります):
^(?!.*mak(e|ing) ?it ?cheaper).*
とがあるため、aまたは aを実行する^
と、上記のいずれに対しても機能します (ただし、 の場合、はオプションであり、 の場合、先読みの外側はオプションです)。$
find
matches
matches
^
find
.*
1: そうは呼ばないかもしれませんが、多くの言語には正規表現と同等の機能matches
とfind
正規表現を備えた機能があります。
上記は、この質問に対する厳密な正規表現の回答です。
より良いアプローチは、元の正規表現 ( mak(e|ing) ?it ?cheaper
) に固執し、使用しているツールまたは言語で一致を直接否定できるかどうかを確認することです。
if (!string.matches(originalRegex))
たとえば、Java では、 の!
代わりにif (string.matches(negLookRegex))
.