2017-03-16 1 views
1

正規表現((?!hede).)*$sasha hedeと一致し、それはedeと一致します。これは意味をなさないものです。しかし、正規表現^((?!hede).)*sasha<space>と一致しますが、それはsasha hedと一致すると予想しました。私は何が欠けていますか?正規表現で負のルックバックがこのように動作するのはなぜですか?

+0

関連:http://stackoverflow.com/questions/30900794/tempered-greedy-token-what-is-different-about-placing-the-dot-before-the-negat – raina77ow

+1

正規表現エンジンの最適化はいくつかありますアンカー '^または$'を使用しています。全体的な結果は、 '$'を指定すると、そこに_starts_という位置があり、可能な限り一致するように減少します。 '^'と同じですが、そこから始まり、できるだけその位置をインクリメントします。それが違いの基本的な理由です。そして、ここでのコンストラクトは、ネガティブなルックアヘッドです(ルックバックではありません)。 – sln

答えて

3

この部分...

((?!hede).)* 

は...「記号の任意の数と一致し、それらのhedeシーケンスの開始ではない」として読み出されます。つまり、一致する部分文字列の各文字と一致するルールを設定します。

sasha hedeにおいて

、唯一sasha、及び(空白)文字は、説明と一致します。ただし、hシンボルは表示されません(hedeシーケンスを開始します)ので、ここで一致を停止する必要があります。

ところで、最初のパターン(文字列の最後にバインドされています)と同じです。パターンで除外された最初のシンボルで一致が停止します。そうでない場合は、edeだけでなく、文字列全体が一致しているはずです。