regulyarnyie-vyirazheniya-osnovyi (852744), страница 8
Текст из файла (страница 8)
Если вы являетесь пользователем Windows,то можете получить доступ к Perl, установив соответствующие пакеты Cygwin(www.cygwin.com) или загрузив самый последний пакет Perl на сайте ActiveState(http://www. acti vestate.com/acti veperl/downloads). Инструкцииотносительно установки Perl можно получить на следующих сайтах: http://learn.perl. org/installing/ или http://www.perl.org/get.html.Чтобы выяснить, установлен ли Perl в вашей системе, воспользуйтесь приведеннойниже командой. Для этого откройте окно командной строки или интерпретатора команд,например окно Terminal (воспользуйтесь меню Applications/Utilities) на компьютере Маеили окно командной строки Windows (откройте стартовое меню и введите cmd в текстовом поле в нижней части меню). Затем введите следующую команду:perl -vЕсли Perl действительно установлен в вашей системе, эта команда вернет информацию об установленной версии.
На своем компьютере Мае, работающемпод управлением OS Х Lion, я установил самую последнюю версию Perl (5.16.0на момент написания книги) путем компиляции исходного кода (ht tp:/ /www.cpan.org/src/5. O/perl-5.16. О. tar.gz). После выполнения приведенной вышекоманды я получил следующую информацию.This is perl 5, version 16, subversion О (v5.16.0) builtfor darwin-21evelCopyright 1987-2012, Larry WallPerl may Ье copied only under the terms of eitherthe Artistic License or the GNU General PuЬlic License,which may Ье found in the Perl 5 source kit.Complete docшnentation for Perl, including FAQ lists,should Ье found on this system using "man perl" or"perldoc perl".
If you have access to the Internet,point your browser at http://www.perl.org/,the Perl Home Page.Отсюда видно, что после компиляции и сборки исходного кода как perl, таки perldoc устанавливаются в каталоге /usr/local/bin, который можно добавитьв список путей, хранящийся в системной переменной РАТН. Более подробную информацию относительно установки или изменения значения переменной РАТН можно найтипо следующему адресу:http://java.com/en/download/help/path.xml42Глава 2.
Сопоставление с простыми шаблонамиГЛАВА 3ГраницыВ этой главе мы сосредоточимся на позиционных привязках. Привязки соответствуют не каким-либо символам, а условным границам, разделяющим символы, т.е. определенным позициям между символами, в связи с чем их называют условиями с нулевойдлиной совпадения (zero-width assertions). Некоторые границы, такие как " и $, называютякорными метасимволами или просто якорями.В этой главе буд ут рассмотрены следующие границы:• начало и конец логической или физической строки;• границы слов (два вида);• начало и конец подстроки;• границы строковых литералов.На первых порах моим инструментом вновь будет приложение RegExr. Кроме того,я буду использовать тот же текст, что и до этого: первые 12 строк содержимого файлаrime.txt. Откройте в браузере веб-приложение RegExr (http://www. regexr.
com/vl /)или воспользуйтесь его настольной версией и скопируйте первые 12 строк файла rime.txtиз архива кода в нижнее текстовое поле (рис. 3.1).Начапо и конец строкиКак вы уже не раз видели, для поиска совпадений с началом логической или физической строки используется метасимвол" (U+OOSE), или циркумфлекс ("крышка"):В зависимости от контекста метасимвол " будет совпадать с началом логической илифизической строки, а иногда и целого документа. Конкретные свойства контекста зависят от приложения и используемых опций.Вы уже знаете, что для поиска совпадений с концом строки используется знак доллара:$Убедитесь в том, что в приложении RegExr установлены флажки multiline (мноrострочный режим) и dotall (точке соответствуют границы строк). При открытии приложения RegExr флажок global (глобальный режим) установлен по умолчанию, нодля данного примера безразлично, установлен он или нет.
При снятом флажке globalвесь целевой текст считается одной строкой, а при снятом флажке dotall точке ( . ) будутсоответствовать все символы, кроме символов конца строки (\n и \r).RegExrSample.sReplaaH•tch"'How. *Country\.si!!_ globalCommunrtyshow •О� fgnore.CaseLJ extended� dotalli:!..J multilineТНЕ RIME OF ТНЕ ANCYENT MARINERE. IN SEVEN PARTS.ARGUMENТ,\w\dHow а Sh1p hav1ng p•ssed the Une was driven Ьу Storms to the coldCountry towards the South Pole1 and how from thence she made her courseto the tropical Latltude of t:he Gгeat P11cific Oce.an1 вnd of the stranget:hings thвt befall1 and ln wtiat mo1nner l:he An�ent Marinere came back tohis own Country.\О!.['АВС]4Му Save.dIt 1s an o11ncyent M.1rinere,And he stoppetf, one of thraa:"Ву thy long grey beard and thy glittering eve"Now ...tierefor• stoppest me"\s\S[АВС][•·•]patt..rn: "'How.
•countryflags: gsrnО captunng groups1_ .ьЬ.t�1osnnercomРис. 3.1. Окно автономного приложения RegExrВведите в верхнем текстовом поле следующее регулярное выражение:лнow.*Country\.$Этому выражению будет соответствовать вся строка, начиная со слова How. Обратитевнимание на то, что точке в конце выражения предшествует обратная косая черта, которая экранирует ее и тем самым превращет из метасимвола в обычный литерал. Если бымы этого не сделали, чему она соответствовала бы? Любому символу. Если вам надо указать соответствие литеральной точке, обязательно экранируйте ее или включите в символьный класс (подробнее об этом - в главе 5).Что произойдет, если мы снимем флажок multiline? Исчезнет цветовое выделение текста.
Оставив этот флажок снятым, а флажок dotall установленным, введите в верхнемтекстовом поле следующее выражение:лТНЕ.*\?$и вы увидите, что ему соответствует весь текст.Опция dotall означает, что в дополнение ко всем прочим символам точке будут соответствовать также символы новой строки. Снимите флажок dotall, и для данного выражения в тексте вновь не будет найдено совпадений. При этих же условиях следующемувыражению будет соответствовать первая строка.лТНЕ.*44Глава 3. ГраницыВновь установите флажок dotall, и последнему выражению станет соответствоватьвесь текст. Для совпадения с оставшейся частью текста включать \?$ в регулярное выражение не потребовалось.Позиции, явпяющиеся и не явпяющиеся границами сповВы уже видели несколько случаев использования метасимвола \Ь.
Он обозначает границу слова, т.е. позицию между словом и пробелом. Введите следующее выражение:\ЬТНЕ\Ьи оно совпадет с двумя вхождениями слова ТНЕ в первой строке (при условии, что установлен флажок global). Как и метасимволы л и$, метасимвол \Ь относится к категорииусловий с нулевой длиной совпадения. Вы можете включать его в выражения для поискатаких, например, объектов, как пробел или начало строки, но то, с чем он совпадает, на самом деле не представляет собой никакого символа. Вы обратили внимание на то, что пробелы, окружающие второе слово ТНЕ, остались невыделенными? Так произошло потому,что они не оказываются частью найденного соответствия.
Возможно, вам трудно уловитьсуть сказанного с первого раза, но после некоторой практики вам все станет понятно.Также существуют позиционные привязки, отличные от границ слов, к которым, например, относятся позиции между буквами или цифрами в слове. Введите в верхнем текстовом поле следующее выражение:\Бе\Би посмотрите, с чем оно совпадает (рис. 3.2). Вы увидите, что ему соответствуют те буквые нижнего регистра, которые окружены другими буквами или символами, не являющимися границами слов. Поскольку это условие с нулевой длиной совпадения, оно не ищетсовпадения с окружающими символами, но способно распознавать те литералы е, которые окружены границами, не являющимися границами слов.В некоторых приложениях границы слов указываются иначе.
Например, для указанияначала слова используется такая последовательность:\<а для указания конца слова - такая:\>Это пример устаревшего синтаксиса, который не применяется в современных приложениях, работающих с регулярными выражениями. В некоторых случаях он оказываетсяполезным, поскольку, в противоположность последовательности \Ь, позволяет различатьначало и конец слова.Если в вашей системе установлен редактор текстов vi или vim, воспользуйтесь им,чтобы проверить, как работает описанный синтаксис. Для этого следуйте приведеннымниже простым инструкциям.
Вы легко их выполните, даже если никогда прежде не работали с редактором vim. Откройте окно командной строки или интерпретатора команд,перейдите в каталог, в котором находится файл с текстом поэмы, и выполните следующую команду:vim rime.txtГлава 3. Границы45RegExrSamplбHa.tdtl� globalL.J 19noreCasliс.....-1 ext,зndQ!di:!JdotallCommunityL., multil1nвТНЕ RIME OF ТНЕ ANCYENТ MPR!NERE, IN SEVEN PARTS.\WARGUMENТ.ldHow а Shlp havlng pas:s.ed the Une vnis drlVl!n Ьу Storms to the cotdCountry towaгds the South Pole: and how from thence she made her cou�et:o the tropic.;з[ Ultitude of the Great Pacific Oce.an; and of th!! strenQethings that befellJ and ln wtlat: manner th-e Ancyent Marlnere. c:ame back tohis Ol',11 Cou ntry.\D1.4Ну Savedl show aU\Ве\В\,\S[АВС)[лдесJIt i,; an ancy41nt Marlnere,And he stoppeth one of three:"Ву thy tong gгеу beard and thy gl1�..ring еуе"Now vA-н!r@fore st:opp�t me?[•-•][a->A·Z]Mёit.ches any chariilcter.
excoC)t for llne,breaks 1f dotaH ls fэls@,R@gExp: /'Ве\6/95pattern: \Ве\Еtugs: gsО capturin9 .group5:о.�.:.ь built о; 9bltin11er.com.lbcut Я.eqE:l'rCnltl'"le ,е,..,,,о"Рис. 3.2. Поиск соответствий границам, не являющимся границами слов,с помощью метасимвола \ ВЗатем введите следующую команду поиска:/\>и нажмите клавишу <Enter> или <Return>.
Косая черта(/) начинает операцию поискав vim. Проследите за позицией курсора, и вы увидите, что данная операция позволяетнаходить концы слов. Для возобновления пошагового поиска служит клавиша n. Далеевведите следующую команду:/\<и вновь нажмите клавишу <Enter> или <Return>. На этот раз операция поиска будет находить начала слов. Для выхода из редактора vim достаточно ввести команду Z Z.Этот же синтаксис работает и в утилите grep. С начала 1970-х годов утилита grep, каки редактор sed, является основной "рабочей лошадкой" Unix. (В 1980-х годах один мойсотрудник с гордостью разъезжал на автомобиле с номерным знаком GREP.) Вы можетебольше узнать о grep, введяman grepилиinfo grep46Гnава 3. Границыв командной строке. Проверьте, как работает эта утилита, введя в командной строке такую команду:grep -Еос '\<(THEIThelthe\>' rime txtОпция -Е указывает на то, что вы хотите использовать расширенный вариант регулярных выражений (ERE), а не базовый (BRE), принятый в grep по умолчанию.
Опция о означает, что в качестве результата будет отображаться только та часть строки, которая совпадаетс шаблоном, тогда как опция с означает, что возвращаться должен только счетчик совпадений. Шаблону, заключенному в одинарные кавычки, будет соответствовать любое из следующих целых слов: ТНЕ, The и the. Поиск целых слов обеспечивается символами< и>.Данная команда возвратит следующий результат:259представляющий общее количество найденных слов.С другой стороны, если исключить символы< и> из шаблона, результат будет совершенно иной.
Выполните следующую команду:grep -Еос '\(THEIThelthe\' rime txtи вы получите другое число:327Почему? Потому что новому шаблону соответствуют не только указанные целые слова, но и любая последовательность, содержащая любое такое слово. Надеюсь, теперь вамстало понятно, какие удобства обеспечивает использование символов< и >.Друrие якорные привязкиСуществует метасимвол, аналогичный якорюной строки:л,которому соответствует начало вход\АЭто сокращение доступно не во всех реализациях регулярных выражений, но по крайней мере в Perl и PCRE (Perl CompatiЫe Regular Expressions) им можно пользоваться.Для поиска совпадений с концом входной строки служит дополняющее его сокращение:\Zили, в некоторых контекстах, такое сокращение:\zУтилита pcregrep - это аналог утилиты grep для библиотеки PCRE.