The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Регулярные выражения в Perl (perl regex script howto)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: perl, regex, script, howto,  (найти похожие документы)
Date: Mon, 23 Oct 2000 12:18:57 +0400 (MSD) From: MailList: Perl в примерах Subject: Регулярные выражения в Perl Регулярные выражения Николай Матковский (matkovsky@ukrpost.net) Регулярные выражения используются для нахождения шаблонов в строках: например, для того, чтобы найти в телефонной книге конкретное имя, или,например, все имена, начинающиеся с буквы 'a'. Работа с регулярными выражениями является одной из самых мощных и полезных, и в тоже время самых сложных для понимания особенностей Perl. Надеемся, что после прочтения этой главы вы поймете, насколько это мощный и удобный инструмент. Получив некоторый опыт вы сможете использовать эти возможности с большой пользой. Операторы Для работы с регулярными выражениями в Perl используются три оператора - оператор сравнения (matching - m//), оператор подстановки (substitution s///) и оператор перевода (translation - tr///). Все три оператора используют переменную $_ по умолчанию, поэтому дальше, пока не будут представлены операции =~ и !~, будем пользоваться ею. Оператор сравнения проверяет, подходит ли проверяемое выражение под шаблон, и возвращает значение 1, если это так, и значение 0 в противном случае. Запись этого оператора состоит из буквы m, разделителя (чаще всего это косая линия - /, но в принципе это может быть почти любой символ), шаблона и еще одного разделителя (такого же, как и первый :). Оператор сравнения $_ = ; if (m/hello/) { print "hello user\n"; } if ($input{'siteurl'} =~ #http://#) { print $input{'siteurl'}; } В этом примере проверяется, есть ли в строке, полученной со стандартного входа, слово 'hello'. Если это так (оператор m// вернет значение 1), то на стандартный выход вернется фраза 'hello user'. Примечание: Вообще-то символ 'm' является необязательным, поэтому оператор из этого примера может выглядеть просто как /hello/. Оператор подстановки находит в строке все подстроки, удовлетворяющие шаблону, и заменяет их некоторым другим значением. Запись этого оператора состоит из буквы s, указывающей на то, что это собственно оператор подстановки и исходного (что заменять) и подстановочного (на что заменять) шаблонов, разделенных разделителями. Оператор подстановки $_ = 'My name is Fred'; # oh no, my name is Jonathan! s/Fred/Jonathan/; В этом примере в строке $_ все слова Fred будут изменены на Jonathan. Оператор перевода также производит подстановку, но несколько другого характера - он используется для замены отдельных символом некоторыми другими (определенными) символами. Синтаксис этого оператора похож на синтаксис оператора подстановки, с тем отличием, что во-первых он очевидно начинается с букв tr, а между разделителями вставляются не шаблоны, а группы символов, первая - исходные символы, вторая - подстановочные, причем соответствующие символы должны стоять на одинаковых позициях в своих группах - если вы хотите заменить, например латинскую 'm' на кириллическую 'м', они должны стоять на одинаковых местах: 'm' - в первой группе символов, 'м' - во второй. Оператор перевода $_ = 'hi.there, my.name.is.jonathan,'; tr/.,/ !/; В этом примере все запятые будут изменены на восклицательные знаки, а точки - на пробелы. Модификаторы Возможности каждого из этих операторов можно расширить при помощии модификаторов. Модификаторы - это грубо говоря символы которые дописываются к оператору (например, так - s/fred/Jonathan/i), говоря о том, как ему нужно разбирать рабочее значение. Модификаторы для оператора сравнения: * g - находит все найденные подстроки * i - игнорирует регистр символов в строке * m - рассматривает строку как многострочное значение * s - рассматривает строку как однострочое значение * x - позволяет использовать расширенные регулярные выражения Модификаторы для оператора подстановки: * e - вычисляет подстановочное выражение перед подстановкой * g - находит все найденные подстроки * i - игнорирует регистр символов в строке * m - рассматривает строку как многострочное значение * s - рассматривает строку как однострочое значение * x - позволяет использовать расширенные регулярные выражения Модификаторы $_ = 'My name is Fred'; s/fred/Jonathan/i; # My name is Jonathan s/jonathan/routine()/ie; # My name is [something] Операции =~ и !~ Операции =~ и !~ позволяют использовать с операторами m//, s/// и tr/// любые переменные, а не только $_, которая используется этими операторами по умолчанию. Оператор =~ выполняет те же функции, что и оператор присваивания '=' (в случае использования с операторами s/// и tr///) и оператор сравнения 'eq' (при использовании с оператором m//). Операция =~ $name = 'my name is Fred'; $name =~ s/fred/Jonathan/ig; $string = 'hello world'; if ($string =~ /hello/i) { print 'helloworlded in this string.'; } Аналогично, операция !~ используется так же как и операция 'ne' (ее написание подобно операции чисельного сравнения !=), используется только с оператором сравнения и означает отрицание удовлетворения шаблону. Операция !~ $string = 'good'; if ($string !~ /bad/) { print "hey, it's not too bad yet!"; } Память И напоследок - о возможности более удобно работать с результатами обработки регулярных выражений, а именно о хранении их в отдельных переменных. Такими переменными являются предопределенные $&, $`, $', и набор переменных $1, $2, ..., $9. Переменная $& Эта переменная предназначена для хранения фрагмента строки, который удовлетворил шаблону, заданному регулярным выражением. Это удобно в таких случаях, как, например, если нужно найти число в строке, но неизвестно, что это за число. Вот как это может выглядеть: Переменная $& $string = "error 404." $string =~ m/\d+/; $number = $&; # $number содержит "404" Переменные $` и $' Эти переменные служат для хранения фрагментов, которые не удовлетворили шаблону, а именно подстрок, которые стоят до и после результата соответственно. Другими словами, после операции, например, сравнения, значение исходой строки разделяется на три части - часть, которая подошла под шаблон, и фрагменты, которые идут перед ней и после нее. Эти части и помещаются в переменные $&, $` и $' соответственно. (Обратите внимание на то, что в первой переменной - обратная кавычка, а во второй - прямая). Посмотрим на предыдущий пример. Переменные $&, $`, $' $string = "error 404." $string =~ m/\d+/; $number = $&; # $number содержит "404" $before = $`; # $before содержит "error" $after = $'; # $after содержит "." Переменные $1..$9 Эти переменные служат для хранения фрагментов строки, которые удовлетворили соответсвующим определенным фрагментам шаблона. В шаблоне фрагменты выделяются при помощи скобок. Каждому фрагменту выделяется номер в том порядке, в котором они расположены, и соответствующая переменная будет содержать его значение. Переменные $1..$9 $string = "this is to be uppercased"; $string =~ s/(upper\w+)/uc($1)/; # $string = "this is to be UPPERCASED" $string = "15 apples, 2 foos, 3 bars"; while ($string =~ m/(\d+) (\w+)/g) { print "$2: $1\n"; } # Выведет apples: 15 # foos: 2 # bars: 3

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ RSS ]
 
  • 1, Владимир, 15:55, 30/09/2005 [ответить] [смотреть все]
  • +/
    Пожалуйста, подскажите как лучше написать регулярное выражение, которое обрабатывало следующую строку:
    "<a ... href="..." > ... </a> "
    где "..." - любое количество символов.
    Мне необходимо, чтобы обрабатывало корректно и неправильно составленные ссылки. В результате должно получиться двумерный массив, которой содержится ссылка и заголовок ссылки, если корректно составлен. Иначе выдавать ошибку
     
  • 2, hurrey, 21:30, 16/10/2005 [ответить] [смотреть все]
  • +/
    да. регексы это хорошо, но если мне надо проверят несколько выражений, в зависимости от ситуации, то как быть? разветвлять ифы неудобно...
     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:





      Закладки на сайте
      Проследить за страницей
    Created 1996-2017 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    Hosting by Ihor TopList