Как я могу применить отрицательный прогноз ко всей группе захвата?

Учитывая следующее регулярное выражение и текст темы, почему отрицательный просмотр вперед применяется только к последнему символу названной группы захвата 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, который должен быть захвачен.


person Greg B    schedule 08.03.2013    source источник


Ответы (1)


Потому что, когда отрицательный прогноз не работает, квантификаторы (и все, что может) будет возвращаться, пока не найдет совпадение.

Вы можете заставить выражение не возвращаться назад, используя атомные группы (?>expression):

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