6. Модификаторы
Поведение регулярных выражений можно менять с помощью модификаторов. Например, как вы уже могли заметить, соответствие строки регулярному выражению проверяется с учетом регистра символов. Изменить это поведение можно с помощью модификатора /i (case insensitivity):
# выражение
$str =~ s/[a-z]/i;
# полностью аналогично
$str =~ s/[a-zA-Z]/;
По-умолчанию производится поиск только первого совпадения регулярному выражению. Модификатор /g позволяет осуществить глобальный (global) поиск:
# выдираем из HTML-файла все, что выделено жирным
# знак вопроса - для отключения жадного разбора
my @words = $html =~ m#<strong>(.*?)</strong>#g;
# будьте осторожны при использовании /g в скалярном контексте
# подробности здесь: http://koorchik.blogspot.com/2011/07/perl-5.html
print "$_\n" for(@words);
Как было сказано выше, точка обозначает любой символ, кроме символа новой строки. Изменить такое поведение можно с помощью модификатора /s:
# выдираем из HTML-файла содержимое статьи,
# которое может содержать далеко не одну и не две строчки
my ($article) = $html =~ m#<div id="article">(.*?)</div>#s;
Кстати, если в регулярном выражении нужно обозначить «любой символ» без использования модификатора /s, используйте выражение [\d\D]. Оно означает «любой символ, являющийся цифрой, или не являющийся цифрой», то есть вообще любой символ.
Наконец, ничто не мешает использовать несколько модификаторов одновременно:
# выдираем из HTML-файла все, что выделено жирным
my @words = $html =~ m#<strong>(.*?)</strong>#gi;
# сработает для <strong>, <STRONG> или даже <StRoNg>
Дополнение: Еще один полезный модификатор — /o. Он означает «компилировать регулярное выражение только один раз». В некоторых случаяхэтот модификатор может существенно ускорить скрипт. Правда, я не уверен, что он поддерживается где-то, кроме как в Perl. За наводку спасибо товарищу@tanraya.
7. Заключение (к.О.)
Данная заметка не претендует на полноту. Однако в ней перечислены почти все возможности регулярных выражений, которыми мне когда либо приходилось пользоваться. Я специально умолчал о замене с помощью регулярных выражений (оператор s/// в Perl), модификаторе /e, работе с юникодом и, возможно, нескольких других моментах.
Заметка и так получилась раза в два больше, чем я планировал. Так что об названных вещах я напишу как-нибудь в другой раз. В качестве источника дополнительной информации я бы рекомендовал man perlrequick (быстрое введение в регулярные выражения) и man perlre (более подробное описание сабжа). Если вы заметили в этом тексте ошибку/неточность или у вас есть вопрос по регулярным выражениям, пишите в комментариях, не стесняйтесь.
Дополнение от Ивана Семенова: набор шпаргалок по регулярным выражениям. Ну и заодно от себя порекомендую эту шпаргалку.
