3

次の正規表現と件名のテキストを考えると、否定先読みが名前付きキャプチャ グループの最後の文字にのみ適用されるのはなぜURLですか?

// Regex
(?<URL>(?<Protocol>\w+):\/\/(?<Domain>[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*)(?!'|"|(</a))

// Subject text
<p><a href="http://example.com">http://example.com</a> and http://example.com</p>

この正規表現には、タグ(?!"|(</a))内の URL を一致させないようにする否定的な先読みがあります。<a>これは、URL の後に引用符 ('または") または終了</aタグが続くかどうかを確認することによって行われます。

私は次の結果を得ています

http://example.co  
http://example.co  
http://example.com

最後の文字だけでなく、キャプチャ グループ全体に否定先読みが適用されることを期待していました。これは可能ですか?私は何を間違っていますか?http://example.comキャプチャされるの最後のインスタンスのみに一致することを期待していました。

4

1 に答える 1

3

否定的な先読みが失敗すると、一致するものが見つかるまで量指定子 (および可能な他のすべて) がバックトラックするためです。

アトミック グループ を使用して、式がバックトラックしないように強制でき(?>expression)ます。

(?<URL>(?>(?<Protocol>\w+):\/\/(?<Domain>[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*))(?!'|"|(</a))
于 2013-03-08T15:56:38.103 に答える