Проблема с отрицательным взглядом за захватом регулярных выражений - PullRequest
4 голосов
/ 22 июля 2011

Я пытаюсь сопоставить адреса электронной почты, но только если им не предшествует "mailto:". Я пытаюсь это регулярное выражение:

"/(?<!mailto:)[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})/"

против этой строки: '<a href="mailto:someemail@domain.com">EMAIL</a> ... otheremail@domain.com '

Я ожидал бы поймать только 'otheremail@domain.com', но я также получаю 'omeemail@domain.com' - см. Пропущенный 's'. Интересно, что здесь не так? Разве я не могу иметь нормальное регулярное выражение после утверждения о взгляде?

Весь мой пример на PHP выглядит так:

<code>$testString = '<a href="mailto:someemail@domain.com">EMAIL</a>  ...   otheremail@domain.com ';
$pattern = "/(?<!mailto:)[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})/";
preg_match_all($pattern, $testString, $matches);
echo('<pre>');print_r($matches);echo('
');

Спасибо!

Ответы [ 3 ]

5 голосов
/ 22 июля 2011

Потому что после s есть строка, которая соответствует вашему регулярному выражению, omeemail@domain.com, и потому что s вряд ли mailto:, она соответствует.Получение границы слова там будет работать в большинстве случаев:

Изменение:

(?<!mailto:)

Кому:

(?<!mailto:)\b

Примечание: используйте example.com дляНапример, domain.com принадлежит фактической компании.

2 голосов
/ 22 июля 2011

Он пытается найти совпадение по адресу «someemail @», но завершается неудачно, потому что ему сразу предшествует «mailto:», поэтому он пытается сопоставить его по адресу «omeemail @», что успешно, потому что ему не предшествует сразу «mailto:».

РЕДАКТИРОВАТЬ: считается, что изменение (?<!mailto:) на (?!mailto:) работает лучше всего.

@ Wrikken: регулярное выражение разрешает "."в адресе электронной почты, но если у вас есть (?<!mailto:)\b, тогда «mailto: some.email @» будет сопоставляться с «email @».

0 голосов
/ 22 июля 2011

Итак, с советами @Wrikken и @MRAB мы придумали окончательное и работающее регулярное выражение:
"/(?<!mailto:)(?<=^|[^A-Za-z0-9_.+@-])[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})/"

Важным моментом было использование предвидения, служащего «границей электронной почты» после негативного взгляда.

...