regulyarnyie-vyirazheniya-osnovyi (852744), страница 7
Текст из файла (страница 7)
Проанализируем, почему так происходит.• Сокращение \Ь находит границу слова, и ему не соответствует никакая буква.• Символы А и Т ограничивают последовательность символов.• Последовательности . { 5 } соответствует последовательность из пяти произвольных символов.• Сокращению \Ь соответствует другая граница слова.На самом деле данное регулярное выражение совпало бы как со словом ANCYENT,так и со словом ANCIENT.А теперь сравните результаты, которые получаются в случае использования следующего выражения:\b\w{7}\bа также следующего:\Ь ....
... \ЬНаконец, упомяну о поиске соответствий нулю или нескольким произвольным символам с помощью следующей последовательности символов:*которая означает то же самое,что и последовательность[ Л \n]или последовательность[ л \n\r]Аналогичную роль играет и точка с квантификатором +, имеющим смысл "один илиболее раз":.+Апробируйте эти выражения в RegExr, и вы увидите, что каждому из них соответствует только первая строка текста (при снятом флажке global).
Такое поведение обусловлено тем, что точка, как правило, не совпадает с символами новой строки, такимикак символ "перевод строки" (U+OOOA) или символ "возврат каретки" (U+OOOD). Если жевы установите флажок dotall (точке соответствуют границы строк),то как . *,так и .+выберут весь целевой текст, отображаемый в нижнем поле. (При установленном флажкеdotall точке соответствуют все символы, включая символы новой строки.)Объясняется это тем, что указанные квантификаторы - жадные; иными словами,онипытаются найти совпадение как можно большей длины.
Однако пока что вам не стоитоб этом задумываться. В главе 7 о квантификаторах и их "жадности" будет рассказаноболее подробно.Глава 2. Сопоставление с простыми шаблонами37Разметка текста теrамиПоэма "T he Rime of the Ancient Mariner" - всего лишь простой текст. А что если этоттекст понадобится отобразить в Интернете? Что если вы захотите разметить его как документ HTMLS не вручную, а с использованием регулярных выражений? Как это сделать?Более подробно об этом будет рассказано в последующих главах, тогда как в этой главе мы сделаем лишь первые шаги в этом направлении, чтобы в дальнейшем постепеннодобавлять новую разметку.Щелкните в RegExr на вкладке Replace (Замена), включите многострочный режим,установив флажок multiline (многострочный режим), и введите в верхнем текстовом полетакое выражение:(лТ.*$)Это выражение совпадет с первой строкой поэмы и запомнит ее в качестве содержимого группы, ограниченной круглыми скобками.Далее введите во втором сверху поле следующий текст:<h1>$1</hl>Подстановочное регулярное выражение помещает захваченную группу, представленную переменной $1, в элемент hl.
Результат можно наблюдать в текстовом поле в нижней части окна. В большинстве реализаций, включая Perl, для указанной переменной использовался бы стиль \1, но приложение RegExr поддерживает только переменные вида$1, $2, $3 и т.д. Больше о группах и обратных ссылках вы узнаете в главе 4.Исnоnьзование редактора sed дnя разметки текстаРазметку текста можно выполнить из командной строки, используя редактор sed. Этопотоковый редактор, способный интерпретировать регулярные выражения и преобразовывать текст. Он был разработан в начале 1970-х годов Ли Макмэхоном из Bell Labs. Есливы работаете на компьютере Мае или на компьютере под управлением Linux, значит, этотредактор у вас уже установлен.Испытайте редактор sed, введя в командной строке (например, в окне Terminalна Мае) следующую команду:echo Hello I sed s/Hello/GoodЬye/Вот что должно произойти после этого.• Команда echo выводит слово Hello на стандартное устройство вывода (каковымобычно является экран), но поскольку вслед за командой echo указан символ канала в виде вертикальной черты ( 1 ), вывод будет передан следующей команде, т.е.редактору sed.•Канал перенаправляет вывод команды echo на вход редактора sed.• Затем команда s (substitute) редактора sed заменяет слово Hello словом Goodbye,и это слово выводится на экран.Те читатели, на компьютерах которых редактор sed еще не установлен, могут установить его, следуя приведенными в конце главы указаниям, которые относятся к двумверсиям sed: BSD и GNU.38Глава 2.
Соnоставление с nростыми шаблонамиКогда будете готовы к работе, введите в командной строке следующую команду:sed -n 's/ л / <hl>/;s/$/ < \/hl>/p;q' rime.txtВы должны получить следующий вывод:< hl>THERIМE OF ТНЕ ANCYENT МARINERE, IN SEVEN PARTS. < /hl>Давайте детально проанализируем эту команду.• Строка начинается с вызова программы sed.• Опция -n подавляет автоматический вывод каждой входной строки, заданныйв sed по умолчанию; выводятся только те строки, для которых это явно указанокомандой р. Мы используем эту опцию для того, чтобы отобразить только строку,которая подвергается воздействию регулярного выражения, т.е. строку 1.• Выражение s/ л /<hl>/ помещает открывающий тег hl в начало(\ л) строки.• Точка с запятой(; ) служит для разделения команд.• Выражение s/$/<\/hl>/ помещает закрывающий тег hl в конец($) строки.• Команда р выводит строку, на которую воздействовало регулярное выражение(строка 1).• Наконец, команда q осуществляет выход из программы, поэтому команда sed обрабатывает только первую строку.• Описанные операции применяются к содержимому файла rime.txt.Ниже показан другой возможный способ написания этой команды, в котором используется опция -е.
Эта опция позволяет объединить команды редактирования, следующие одна за другой:sed -ne 's/ л / < hl>/' -е 's/$/ < \/hl>/p' -е 'q' rime.txtЧто касается меня, то я, конечно же, предпочитаю более экономный способ разделения команд, предполагающий использование точки с запятой. Кроме того, можнособрать все команды в одном файле, аналогичном представленному ниже файлу hl.sed(этот файл находится в архиве примеров).#!/usr/Ьin/sed5/ Л / <hl>/s/$/ < \/hl>/qЧтобы выполнить этот файл, перейдите в каталог(или папку), в котором находитсяфайл rime.txt, и введите в командной строке следующую команду:sed -f hl.sed rime.txtИспоnьзование Perl дnя разметки текстаНаконец, я покажу вам, как можно сделать то же самое с помощью Perl - универсального языка программирования, созданного Ларри Уоллом в 1987 году.
Этот язык получилширокую известность благодаря предусмотренной в нем мощной поддержке регулярныхвыражений и широким возможностям обработки текстов.Гnава 2. Сопоставnение с простыми wабnонами39Чтобы проверить, установлен ли Perl в вашей системе, введите в командной строкеследующую команду (нажав в конце клавишу <Enter> ):perl -vВ результате на экране отобразится номер версии Perl, установленной в вашей системе, или сообщение об ошибке (см.
раздел "На заметку").Для получения того же вывода, что и в примере с редактором sed, введите в командной строке следующую команду:perl -ne 'if ($.� rime. txt==1) { s/ л /<hl>/; s/$/<\/hl>/m; print; } 'которая должна отобразить уже знакомую вам строку<hl>THE RIME OF ТНЕ ANCYENT МARINERE, IN SEVEN PARTS.</hl>Распишем подробно, что делает каждая из отдельных составляющих приведеннойвыше команды Perl.• Команда per 1 вызывает программу Perl.• Опция -n задает цикл по строкам входного файла (rime.txt).• Опция -е позволяет передавать код программы из командной строки, а не из файла (аналогично sed).• Оператор i f проверяет, является ли обрабатываемая строка первой.
Переменная$ . - это специальная переменная Perl, которой соответствует текущая строка.• Первая команда подстановки s находит начало первой строки ( л) и вставляет вместе нее открывающий тег hl.• Вторая команда подстановки находит конец строки ($) и вставляет в этой позиции закрывающий тег hl.• Модификатор, или флаг, m (от multiline - многострочный) в конце команды подстановки указывает на то, что вы хотите обрабатывать данную строку особымобразом, отдельно от других, и поэтому символу $ соответствует конец строки l,а не конец файла.• Наконец, команда выводит результат на стандартное устройство вывода (экран).• Опять-таки, описанные операции применяются к файлу rime.txt.Кроме того, можно собрать все команды в одном программном файле, аналогичномпредставленному ниже файлу hl.pl (этот файл находится в архиве примеров).#!/usr/bin/perl -nif ($. == 1) {g/ Л /<hl>;s/$/<\/hl>/m;pпnt;}Чтобы выполнить этот файл, перейдите в каталог (или папку), в котором находитсяфайл rime.txt, и введите в командной строке следующую команду:perl hl.pl rime.txt40Глава 2.
Сопоставление с простыми шаблонамиВ Perl любую задачу всегда можно решить множеством способов. Я вовсе не утверждаю, что рассмотренный нами способ добавления тегов является наиболее эффективным. Это всего лишь один из множества вариантов. Велика вероятность того, что к томувремени, когда вы будете читать книгу, я придумаю другие, более эффективные способырешения задач с помощью Perl (и других инструментов). Надеюсь, что то же самое можетбыть сказано и о вас.В следующей главе мы поговорим о границах и о так называемых условиях с нулевойдлиной совпадения (zero-width assertions).О чем вы узнапи в rпаве 2• Как находить совпадения со строковыми литералами.• Как находить совпадения с цифровыми и нецифровыми символами.• Что такое глобальный режим.• Как символьные сокращения соотносятся с символьными классами.• Как находить совпадения с символами, входящими и не входящими в состав слов.• Как находить совпадения с пробелами.• Как находить совпадения с произвольным одиночным символом с помощью точки.• Что такое режим dotall.• Как вставить НТМL-разметку в строку текста с помощью RegExr, sed и Perl.На заметку• Сайт веб-приложения RegExr: www.regexr.
com. Приложение RegExr создавалось с использованием библиотеки Flex 3 (http://www.adobe.com/products/flex.html) на базе движка ActionScript (http: //www.adobe.com/devnet/actionscript.html), регулярные выражения которого аналогичны тем, которые используются в JavaScript (https: //developer.mozilla.org/en/JavaScript/Reference/Global_Obj ects/RegExp).• Git - это быстрая система управления версиями (http://git-scm.com). GitHub(http://github.com) - это веб-репозиторий проектов, в котором используется Git. Я советую использовать GitHub лишь в том случае, если вы уверенно работаете с Git или какой-либо другой современной системой управления версияминаподобие Subversion или Mercurial.• HTMLS (http://www.wЗ.org/TR/html5/) - это пятая версия разрабатываемого консорциумом WЗС стандарта HTML, который определяет язык разметкидокументов, публикуемых в Интернете.
В течение вот уже нескольких лет этотстандарт существует в виде чернового варианта и регулярно подвергается изменениям, однако воспринимается широкими кругами специалистов как бесспорныйнаследник стандартов HTML 4.01 и XHTML.• Редактор текстов sed доступен в системах Unix/Linux, включая их версии для Мае (Darwin и BS D). Пользователям Windows он доступен либоГлава 2. Сопоставление с простыми шаблонами41в составе дистрибутивных пакетов, таких как Cygwin (h t t р://www. с ygwin.com), либо в виде отдельного приложения, которое можно загрузить по адресуhttp: //gnuwin32.sourceforge. net/packages/sed.htm (текущая версия4.2.1; см. http://www.gnu.org/software/sed/manual/sed.html).• Для воспроизведения примеров с Perl вам, возможно, потребуется установить Perlв своей системе. По умолчанию этот язык поставляется вместе с системой Мае OS ХLion и часто уже включен в системы Linux.