6

正規表現演算子がどのように機能するかを理解していると思っていましたが、今では本当に混乱しています。簡単な例では、2 つの文字列があります。

mail.wow.no-1.com
mail.ololo.wow.com

2番目ではなく、最初のものと一致させたい。そして、私は次のような正規表現(簡易版)を書いています:

^mail\.(.*)(?!\.wow\.com)$

そして、これらの両方の例で JS メソッド テストを実行すると、単純に true が返されます (崇高な 2 正規表現検索では、両方の文字列が強調表示されます。つまり、両方の文字列が一致したことを意味します)。

(?!)逆正規表現を作成できることはわかっています。これは2番目に一致し、これに応じてロジックを作成しますが、正規表現でどのように機能し、何が間違っているのかを理解したいだけです。

ありがとう。

4

4 に答える 4

8

.*先読みの内側が必要です(そして先読みの.*外側の前に移動します):

^mail(?!.*\.wow\.com)\.(.*)$

それ以外の場合、先読みは文字列の最後でのみチェックします。そして明らかに、文字列の最後に . が存在することはありません.wow.com。先読みをパターンの先頭に移動することもできます。

^(?!.*\.wow\.com)mail\.(.*)$

動作デモ。

この最後のバリアントは少し効率が悪いですが、文字列全体に影響する先読みがすべてパターンの先頭にあると、パターンが少し読みやすくなります。

于 2013-08-15T09:43:02.930 に答える
3

あなたが欲しいのは

^mail\.(?!.*\.wow\.com$).*$

他の人が述べたように、 (?!) は負のゼロ幅先読みアサーションです。任意の数の文字と一致するわけではありませんが、次の文字を調べて、括弧内に含まれるものと一致しないことを確認します。

Javascript は、Perl から正規表現構文をコピーしました。これらは一般に PCRE、または Perl 互換の正規表現として知られています。ただし、Javascript には先読みしかありません。つまり、この時点から未来を見ることができます。Perlには負のゼロ幅の後読みもあります。これは元の例のように機能し、この場合はより簡単です

# this is how it could be done in Perl
^mail\..*(?<!\.wow\.com)$

ただし、Javascript は後読みをサポートしないことを選択しました。

于 2013-08-15T09:55:45.920 に答える
3

これはゼロ幅のアサーションです。ネガティブな先読みです。

それが何を言っているのか:この位置では、次のことはできません。

ですから、たとえば(?!q)、手紙qは今すぐフォローできません。

于 2013-08-15T09:42:32.423 に答える
1

この URL を調べると、「メール」が検索されます。次に、できるだけ多くの文字を入力し、その文字列 (文字列の末尾) と画面の末尾の間に ".wow.com" が存在するかどうかを確認します。

^mail\.(.*)(?!\.wow\.com)$

代わりに、「.wow.com」が「mail.」の後に来るかどうかを確認するように並べ替えます。

^mail\.(?!.*\.wow\.com)(.*)$
于 2013-08-15T09:45:50.660 に答える