2013-08-14 36 views
10

以下のパターンを除外します。RegEx - 一致するパターンを除外

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 

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

検索から、私は否定的なlookahead/lookのような何かを必要と思われる。しかし、私は本当にそれを取得しません。ある人が私を正しい方向に向けることができますか?

答えて

17

あなただけそうのような負の先読みにそれを置くことができます。ただ、そのような

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

はあなたが matches をすれば、以降かかわらず仕事に行くされていない、それはないだろうあなたが先を見ているだけなので、実際には一致していません。 find は、文字列内の多くの場所から始めることができます上記と一致しない。あなたは が正確はそれらの1(すなわち、「それcheaperblahblah作る」であるすべての文字列を除外したい場合は

  1. は、あなたが何をしたいかに応じて、この問題を解決するために、我々は2つの選択肢を持っています)除外されていない、文字列の先頭(^)とend($)を確認してください:

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

    .*(ゼロ以上のワイルドカード)は、実際のマッチング取る場所です。負のルックアヘッドは最初の文字からチェックします。

  2. あなたはすべての文字列これらの 1を含むを除外したい場合は、先読みは、我々が一致し、すべての文字の前にマッチしていないことを確認することができます

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

    代替は、野生を追加することですあなたのルックアヘッド(つまり、文字列の先頭から何も入っておらず、あなたのパターンを含むすべての文字列を除外しますが、私は現在、これに何らかの利点を見ません(任意の長さの先読みも任意のツールでサポートされる可能性は低いです)。ため^$、いずれかmatchesの場合には、しかし(上記のいずれかのために働くfind又はmatchesを行う

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

^は、の場合には、オプションでありfind、先読み外の.*はオプションです)。


1:彼らは多くの言語は、正規表現でmatchesfindと同等の機能を持っている、ということと呼ばれることはないかもしれないが。


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

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

例えば、if (!string.matches(originalRegex))!に注意してください)は、if (string.matches(negLookRegex))ではなく、返されたブール値を否定します。

6

私はあなたが探しているものと信じています。多分試してください:

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

そしておそらく、もう少し柔軟:

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

つ以上のスペースがあります念のため。

関連する問題