Регулярные выражения в Perl
Автор:red_byte
Оригинал
[INTRO]
Регулярные выражения - термин, который служит для обозначения образца, состоящего из символов, который используется при анализе строковых данных. Скрипты Perl’а используют символьные образцы для того, чтобы провести анализ входных данных, расделяя их на части. Если входные данные имеют строго определенный формат, в этом случае с задачей обработки данных могут справиться и стандартные строковые функции. Но когда входные данные имеют произвольный формат, то с такой задачей справиться под силу только либо самостоятельно написанным программистом функциям, либо регулярным выражениям. На мой взгляд, второе предпочтительней и удобнее. В этой статье я подробно расскажу о таких выражениях, и покажу, как можно использовать их на практике.
[Таблица знаков, используемых в регулярных выражениях]
Для того чтобы уменьшить размер регулярных выражений, perl использует специальные символы для обозначения соответствий. В следующей таблице я бы хотел тебя познакомить с этой таблицей соответствия. Советую тебе распечатать ее и повесить куда-нибудь на видное место около компьютера, чтобы можно было пользоваться ей как шпаргалкой
Символ Описание
. Любой символ (за исключением символа новой строки)
(..) Группирует последовательность элементов
+ Удовлетворяет предыдущему образцу один или более раз
? Удовлетворяет образцу нуль или один раз
[...] Соответствует символу из заданного множества
[^...] Соответствует символу из множества, заданного отрицанием
* Соответствует образцу нуль или один раз
(...|...|...)Соответствует одной из предложенных альтернатив
$ Соответствует образцу в конце строки
^ Соответствует началу строки
{n, m} Соответствует образцу от n до m раз
{n} Соответствует образцу точно n раз
{n,} Соответствует образцу минимум n раз
\n\t Соответствует символу новой строки, знаку табуляции и т.д.
\b Соответствует границе слова
\В Соответствует внутри границ слова
\d Соответствует цифре
\D Соответствует не цифре
\s Соответствует пробелу
\S Соответствует не пробелу
\w Соответствует букве или цифре
\W Соответствует символу, не являющимся не буквой, ни цифрой
[Поиск по ключевым словам]
Итак, как уже было сказано выше, скрипты языка Perl используют регулярные выражения для того, чтобы значительно упростить сравнение строк. Регулярные выражения помещаются между двумя слешами. Таким образом, в качестве самого простого примера регулярного выражения можно привести пример поиска наличия подстроки darkcoders.net во входной строке $str:
if ($str =~ /darkcoders.net/)
В данном случае возвращается значение <истинно>, если образец обнаружен в строке $str. Если строка не содержит образца dark, то выражение возвращает значение <ложно>. Для того чтобы проверить полное совпадение, сравнение должно быть привязано к началу и концу строки. Например, следующее выражение имеет значение <истинно>, если только переменная $str принимает одно из трех значений: <darkc>, <darkcc> и <darkccc>:
if ($str =~ /^dark© {1,3}$/)
Аналогичным образом, следующее выражение истинно только тогда, когда переменная $str содержит слово <red> и не является частью другого слова, такого как <red_byte>.
($str =~ /\bred\b/)
Perl поддерживает также другую форму сравнения с образцом, использующая оператор (=~), но добавляющая отрицание результата: (!~). Этот оператор эквивалентен выражению:
!($str =~ /sample/)
[Использование регулярных выражений для анализа входных данных]
По мере усложнения твоих перловых скриптов возникнет много случаев, когда ты хочешь узнать больше, чем просто проверить, присутствует ли заданный образец в данной. Например, тебе потребуется чтобы скрипт извлек определенное значение из строки. Используя символы группировки () внутри регулярного выражения, скрипт может извлечь соответствующие образцу значения из строки и сформировать из них список. Например, кусок кода использует регулярные выражения для того, чтобы извлечь день,месяц и год дня рождения нашего проекта DarkCoders:
$str = " DarkCodersCrew 8.01.06";
($name, $d, $m, $y) = $str =~ /\s*(\S*)\s+(\d*)\D*(\d+)\D*(\d*)/;
print "$name was found on $d-$m-20$y";
Результат работы скрипта:
http://news.xss.pro/perl_regexp.gif
Теперь разберем step-by-step, что же делает это регулярное выражение:
1)Пропустить пробел, если он есть
2)Записать все символы, не являющиеся специальными в переменную $name 3)Пропустить пробел
4)Записать число в переменную $d
5)Пропустить точку
6)Записать число в переменную $m
7)Пропустить точку
8)Записать число в переменную $y
[Регулярные выражения для поиска и замены строк]
До этого момента мы использовали только операторы, проверяющие на соответствие образцу. Но, оказывается, Perl поддерживает также два других регулярных выражения, которые могут модифицировать проверяемую строковую переменную. В приведенном дальше куске кода Perl замещает часть троки, которая соответствует образцу, на заданную строку:
$str =~ s/образец/строка замены/;
Например, следующая конструкция заменит слово <dark> на <light>:
$str =~ s/\bdark\b/light/;
Чтобы заменить все встретившиеся слова на light, надо изменить код вот так: $str =~ s/\dark\b/light/g;
В данном случае постфикс g в конце выражения указывает языку Perl на необходимость глобальной подстановки. А используя постфикс i, можно задать выполнение поиска с учётом регистра. В противоположность простой проверке на соответствие образцу, следующее выражение осуществляет также и замену:
$str =~ tr/Список_поиска/Список_замены/;
Например, чтобы перевести все символы из нижнего регистра в верхний, можно использовать такой код:
$str =~ tr/a-z/A-Z/;
[OUTRO]
Я надеюсь, что моя статья помогла тебе разобраться в этой нелегкой теме регулярных выражений. Если что-то не понял, перечитай еще раз. Если у тебя будут ко мне вопросы, пиши, я постараюсь на них ответить. Удачного кодинга
Copyright 2005-2006 © DarkCoders crew. Копирование статей только с указанием имени автора и ссылки на сайт http://www.darkcoders.net
Автор:red_byte
Оригинал
[INTRO]
Регулярные выражения - термин, который служит для обозначения образца, состоящего из символов, который используется при анализе строковых данных. Скрипты Perl’а используют символьные образцы для того, чтобы провести анализ входных данных, расделяя их на части. Если входные данные имеют строго определенный формат, в этом случае с задачей обработки данных могут справиться и стандартные строковые функции. Но когда входные данные имеют произвольный формат, то с такой задачей справиться под силу только либо самостоятельно написанным программистом функциям, либо регулярным выражениям. На мой взгляд, второе предпочтительней и удобнее. В этой статье я подробно расскажу о таких выражениях, и покажу, как можно использовать их на практике.
[Таблица знаков, используемых в регулярных выражениях]
Для того чтобы уменьшить размер регулярных выражений, perl использует специальные символы для обозначения соответствий. В следующей таблице я бы хотел тебя познакомить с этой таблицей соответствия. Советую тебе распечатать ее и повесить куда-нибудь на видное место около компьютера, чтобы можно было пользоваться ей как шпаргалкой
Символ Описание
. Любой символ (за исключением символа новой строки)
(..) Группирует последовательность элементов
+ Удовлетворяет предыдущему образцу один или более раз
? Удовлетворяет образцу нуль или один раз
[...] Соответствует символу из заданного множества
[^...] Соответствует символу из множества, заданного отрицанием
* Соответствует образцу нуль или один раз
(...|...|...)Соответствует одной из предложенных альтернатив
$ Соответствует образцу в конце строки
^ Соответствует началу строки
{n, m} Соответствует образцу от n до m раз
{n} Соответствует образцу точно n раз
{n,} Соответствует образцу минимум n раз
\n\t Соответствует символу новой строки, знаку табуляции и т.д.
\b Соответствует границе слова
\В Соответствует внутри границ слова
\d Соответствует цифре
\D Соответствует не цифре
\s Соответствует пробелу
\S Соответствует не пробелу
\w Соответствует букве или цифре
\W Соответствует символу, не являющимся не буквой, ни цифрой
[Поиск по ключевым словам]
Итак, как уже было сказано выше, скрипты языка Perl используют регулярные выражения для того, чтобы значительно упростить сравнение строк. Регулярные выражения помещаются между двумя слешами. Таким образом, в качестве самого простого примера регулярного выражения можно привести пример поиска наличия подстроки darkcoders.net во входной строке $str:
if ($str =~ /darkcoders.net/)
В данном случае возвращается значение <истинно>, если образец обнаружен в строке $str. Если строка не содержит образца dark, то выражение возвращает значение <ложно>. Для того чтобы проверить полное совпадение, сравнение должно быть привязано к началу и концу строки. Например, следующее выражение имеет значение <истинно>, если только переменная $str принимает одно из трех значений: <darkc>, <darkcc> и <darkccc>:
if ($str =~ /^dark© {1,3}$/)
Аналогичным образом, следующее выражение истинно только тогда, когда переменная $str содержит слово <red> и не является частью другого слова, такого как <red_byte>.
($str =~ /\bred\b/)
Perl поддерживает также другую форму сравнения с образцом, использующая оператор (=~), но добавляющая отрицание результата: (!~). Этот оператор эквивалентен выражению:
!($str =~ /sample/)
[Использование регулярных выражений для анализа входных данных]
По мере усложнения твоих перловых скриптов возникнет много случаев, когда ты хочешь узнать больше, чем просто проверить, присутствует ли заданный образец в данной. Например, тебе потребуется чтобы скрипт извлек определенное значение из строки. Используя символы группировки () внутри регулярного выражения, скрипт может извлечь соответствующие образцу значения из строки и сформировать из них список. Например, кусок кода использует регулярные выражения для того, чтобы извлечь день,месяц и год дня рождения нашего проекта DarkCoders:
$str = " DarkCodersCrew 8.01.06";
($name, $d, $m, $y) = $str =~ /\s*(\S*)\s+(\d*)\D*(\d+)\D*(\d*)/;
print "$name was found on $d-$m-20$y";
Результат работы скрипта:
http://news.xss.pro/perl_regexp.gif
Теперь разберем step-by-step, что же делает это регулярное выражение:
1)Пропустить пробел, если он есть
2)Записать все символы, не являющиеся специальными в переменную $name 3)Пропустить пробел
4)Записать число в переменную $d
5)Пропустить точку
6)Записать число в переменную $m
7)Пропустить точку
8)Записать число в переменную $y
[Регулярные выражения для поиска и замены строк]
До этого момента мы использовали только операторы, проверяющие на соответствие образцу. Но, оказывается, Perl поддерживает также два других регулярных выражения, которые могут модифицировать проверяемую строковую переменную. В приведенном дальше куске кода Perl замещает часть троки, которая соответствует образцу, на заданную строку:
$str =~ s/образец/строка замены/;
Например, следующая конструкция заменит слово <dark> на <light>:
$str =~ s/\bdark\b/light/;
Чтобы заменить все встретившиеся слова на light, надо изменить код вот так: $str =~ s/\dark\b/light/g;
В данном случае постфикс g в конце выражения указывает языку Perl на необходимость глобальной подстановки. А используя постфикс i, можно задать выполнение поиска с учётом регистра. В противоположность простой проверке на соответствие образцу, следующее выражение осуществляет также и замену:
$str =~ tr/Список_поиска/Список_замены/;
Например, чтобы перевести все символы из нижнего регистра в верхний, можно использовать такой код:
$str =~ tr/a-z/A-Z/;
[OUTRO]
Я надеюсь, что моя статья помогла тебе разобраться в этой нелегкой теме регулярных выражений. Если что-то не понял, перечитай еще раз. Если у тебя будут ко мне вопросы, пиши, я постараюсь на них ответить. Удачного кодинга
Copyright 2005-2006 © DarkCoders crew. Копирование статей только с указанием имени автора и ссылки на сайт http://www.darkcoders.net