Perl — один из сильнейших языков для работы с регулярными выражениями. Для сопоставления используют операторы =~ и !~.
Модификаторы регулярных выражений:
i — регистр не важенg — глобальный поиск (все вхождения)m — многострочный режим (работает ^ и $ на каждую строку)s — точка (.) включает символ новой строкиПример:
my $text = "My email: max@mail.com and ann@ya.ru."; while ($text =~ /([\w.]+@[\w.]+)/g) { print "Email: $1 "; }
В этом примере цикл извлекает все email из строки.
После сопоставления значения захватываются в специальные переменные $1, $2, ... (по каждой захватывающей группе).
Что будет храниться в переменной $1 после неудачного поиска по регулярному выражению?
Ответ:
$1не обновляется при неуспешном совпадении — оно хранит значение последнего успешного сопоставления. Это потенциальный источник ошибок! Чтобы избежать этого, в сложных условиях лучше явно очищать$1,$2, ...
История
Валидация входных данных сложным регулярным выражением зависела от значения
$1. После очередного сопоставления, не нашедшего подходящей строки, переменная$1не изменилась, и обработка прошла по старому неправильному email адресу.
История
Программист ошибся с модификатором. В большом тексте применили
/abc/g, рассчитывая на многострочный режим. В результате паттерн не находил нужные строки с переносами, хотя надо было использовать/abc/ms.
История
В проекте забыли использовать глобальный флаг
/gпри поиске всех вхождений. Следствие — скрипт извлекал только первое совпадение, а пользователь ждал полный список данных.