1
正規表現((?!hede).)*$
はsasha hede
と一致し、それはede
と一致します。これは意味をなさないものです。しかし、正規表現^((?!hede).)*
はsasha<space>
と一致しますが、それはsasha hed
と一致すると予想しました。私は何が欠けていますか?正規表現で負のルックバックがこのように動作するのはなぜですか?
正規表現((?!hede).)*$
はsasha hede
と一致し、それはede
と一致します。これは意味をなさないものです。しかし、正規表現^((?!hede).)*
はsasha<space>
と一致しますが、それはsasha hed
と一致すると予想しました。私は何が欠けていますか?正規表現で負のルックバックがこのように動作するのはなぜですか?
この部分...
((?!hede).)*
は...「記号の任意の数と一致し、それらの各がhede
シーケンスの開始ではない」として読み出されます。つまり、一致する部分文字列の各文字と一致するルールを設定します。
sasha hede
において
、唯一s
、a
、s
、h
、a
、及び(空白)文字は、説明と一致します。ただし、
h
シンボルは表示されません(hede
シーケンスを開始します)ので、ここで一致を停止する必要があります。
ところで、最初のパターン(文字列の最後にバインドされています)と同じです。パターンで除外された最初のシンボルで一致が停止します。そうでない場合は、ede
だけでなく、文字列全体が一致しているはずです。
関連:http://stackoverflow.com/questions/30900794/tempered-greedy-token-what-is-different-about-placing-the-dot-before-the-negat – raina77ow
正規表現エンジンの最適化はいくつかありますアンカー '^または$'を使用しています。全体的な結果は、 '$'を指定すると、そこに_starts_という位置があり、可能な限り一致するように減少します。 '^'と同じですが、そこから始まり、できるだけその位置をインクリメントします。それが違いの基本的な理由です。そして、ここでのコンストラクトは、ネガティブなルックアヘッドです(ルックバックではありません)。 – sln