21

以下のパターンを除外する必要があります。

make it cheaper
make it cheapere
makeitcheaper.com.au
makeitcheaper
making it cheaper
www.make it cheaper
ww.make it cheaper.com

これらのいずれかに一致する正規表現を作成しました。ただし、これら以外はすべて取得したい。私が作成したこの正規表現を逆にする方法がわかりません。

mak(e|ing) ?it ?cheaper

上記のパターンは、リストされているすべての文字列に一致します。今、私はそれを他のすべてのものと一致させたいと思っています。どうすればいいのですか?

検索から、否定的な先読み/振り返りのようなものが必要なようです。でも、よくわかりません。誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

31

次のように、否定的な先読みに入れることができます。

(?!mak(e|ing) ?it ?cheaper)

ただし、matches1を実行すると、先を見ているだけなので一致しません。実際には何も一致しておらず、find1を実行すると一致します。これは、次の文字が上記と一致しない文字列内の多くの場所から開始できるためです。

これを修正するには、目的に応じて 2 つの選択肢があります。

  1. これらの文字列の 1 つであるすべての文字列を除外する場合(つまり、「安くする」は除外されません)、文字列の開始 ( ) と終了 ( ) を確認ます^$

    ^(?!mak(e|ing) ?it ?cheaper$).*
    

    ( .*0 個以上のワイルドカード) は、実際に行われるマッチングです。最初の文字からの否定先読みチェック。

  2. それらのいずれかを含むすべての文字列を除外する場合は、一致するすべての文字の前に先読みが一致しないようにすることができます。

    ^((?!mak(e|ing) ?it ?cheaper).)*$
    

    別の方法は、先読みの先頭にワイルドカードを追加することです(つまり、文字列の先頭から何かを含むすべての文字列を除外し、次にパターンを除外します)が、現在これには利点がありません(任意の長さの先読みも、特定のツールでサポートされる可能性が低くなります):

    ^(?!.*mak(e|ing) ?it ?cheaper).*
    

とがあるため、aまたは aを実行する^と、上記のいずれに対しても機能します (ただし、 の場合、はオプションであり、 の場合、先読みの外側はオプションです)。$findmatchesmatches^find.*


1: そうは呼ばないかもしれませんが、多くの言語には正規表現と同等の機能matchesfind正規表現を備えた機能があります。


上記は、この質問に対する厳密な正規表現の回答です。

より良いアプローチは、元の正規表現 ( mak(e|ing) ?it ?cheaper) に固執し、使用しているツールまたは言語で一致を直接否定できるかどうかを確認することです。

if (!string.matches(originalRegex))たとえば、Java では、 の!代わりにif (string.matches(negLookRegex)).

于 2013-08-14T20:24:34.203 に答える
9

否定的な先読みは、あなたが探しているものだと思います。多分試してください:

(?!.*mak(e|ing) ?it ?cheaper)

そして多分もう少し柔軟です:

(?!.*mak(e|ing) *it *cheaper)

複数のスペースがある場合に備えて。

于 2013-08-14T20:23:49.917 に答える