Короче говоря, мне нужно сопоставить все URL-адреса в текстовом блоке, которые относятся к определенному домену и не содержат определенного параметра и значения строки запроса (см. = Twitter)
У меня есть следующее регулярное выражение для сопоставления всех URL-адресов домена.
\b(https?://)?([a-z0-9-]+\.)*example\.com(/[^\s]*)?
Я просто не могу заставить работать последнюю часть
(?![&?]refer=twitter)\b(https?://)?([a-z0-9-]+\.)*example\.com(/[^\s]*)?
Так что следующее ДОЛЖНО совпадать
example.com
http://example.com/
https://www.example.com#link
www.example.com?somevalue=foo
Но это НЕ должно
https://www.anotherexample.com#link
www.example.com?refer=twitter
EDIT:
И если вы можете получить его, чтобы соответствовать
http://example.com?foo=foo.bar
из предложения типа
For examples go to http://example.com?foo=foo.bar.
без учета периода, это было бы здорово!
EDIT2:
Исправлена проблема трейлинг-периода с этим
\b(https?://)?([a-z0-9-]+\.)*example\.com/?([^\s]*[^.])?
EDIT3:
Кажется, это работает, или, по крайней мере, 99% тестов, которые я провел,
(?!\b.*[&?]refer=twitter)\b(https?://)?([a-z0-9-]+\.)*example\.com/?([^\s]*[^.])?
EDIT4:
Поселено
\b(?!.*[&?]refer=twitter)(https?://)?([a-z0-9-]+\.)*nygard\.com(?!\.)[^\s]*\b+