regulyarnyie-vyirazheniya-osnovyi (852744), страница 20
Текст из файла (страница 20)
Теперь вы уже далеко не новичок в области регулярных выражений.Вам был представлен синтаксис наиболее часто используемых регулярных выражений,что открыло перед вами много новых возможностей.Знание регулярных выражений сэкономило мне массу времени. Позвольте привестиконкретный пример.По роду работы мне часто приходится использовать XSLT, и во многих случаях я должен анализировать теги, встречающиеся в группе ХМL-файлов.Кое-что из этого я постарался продемонстрировать вам в последней главе, а сейчаспрошу взглянуть на однострочную команду, которая выбирает список тегов из файлаlorem.dita и преобразует его в простую таблицу стилей XSLT.grep -Ео '<[_a-zA-Z][л >]*>' lorem.dita I sort I uniq I sed�'1 i\<xsl:stylsheet version ="2.0" xmlns:xsl="http://www.wЗ.org/1999/XSL/Transform">\s/ л </\<xsl:template match="/;s/ id=\".*\"//;s/>$/">\<xsl:apply-templates\/>\<\/xsl:template>/;$ а\\</xsl:stylesheet>\Я знаю, что этот сценарий выглядит сплошной эквилибристикой, но, после тогокак вы внимательно его изучите, ваше мнение изменится.
Я даже не буду объяснять,что именно делает эта команда, поскольку уверен, что теперь вы и сами вполне можетев этом разобраться.Вот как выглядит вывод этой команды.<xsl:stylsheet version ="2.0" xmlns:xsl=�"http://www.wЗ.org/1999/XSL/Transform"><xsl:template match= "body"><xsl:apply-templates/></xsl:template><xsl:template match="li"><xsl:apply-templates/></xsl:template><xsl:template match="p"><xsl:apply-templates/></xsl:template><xsl:template match="title"><xsl:apply-templates/></xsl:template><xsl:template match="topic"><xsl:apply-templates/></xsl:template><xsl:template match="ul"><xsl:apply-templates/></xsl:template></xsl:stylesheet>Это всего лишь начало.
Конечно же, над такой простой таблицей стилей нужно ещенемало потрудиться, прежде чем она сможет делать что-нибудь полезное, но зато онаизбавит вас от необходимости вручную вводить большие объемы данных.Я признаю, что было бы проще поместить все вышеприведенные команды sed в файл.В действительности я так и сделал. Соответствующий файл xslt.sed вы найдете в архивепримеров. Вот его содержимое.# ! /usr/Ьin/sed1 i\<xsl:stylsheet version="2.0" xmlns:xsl=�"http://www.wЗ.org/1999/XSL/Transform">\s/Л</\<xsl:template match="/;s/ id=\".*\"//;s/>$/">\<xsl:apply-templates\/>\<\/xsl:template>/;$ а\\</xsl:stylesheet>\Ниже показано, как запустить этот файл на выполнение.grep -Ео '<[_a-zA-Z][ л >]*>' lorem.dita I sort 1�uniq I sed -f xslt.sedЧто дапьwеНесмотря на то что сейчас вы уже достаточно хорошо подготовлены для работы с регулярными выражениями, вам еще предстоит многому научиться. Хочу предложить ряддрутих книг, которые вам стоило бы прочитать.Мои советы основаны на личном опыте и наблюдениях и не продиктованы никакимирекламными соображениями.
Я делаю это совершенно искренне, потому что чтение перечисленных ниже книг действительно пойдет вам на пользу.116Глава 10. Конец началаКнига Джеффри Фридла Регулярные выражения, 3-е издание (Символ-Плюс, 2008 г.) источник, к которому обращаются многие программисты в поиске компетентного рассмотрения регулярных выражений. Если вы собираетесь серьезно работать с регулярными выражениями, то эта содержательная и хорошо написанная книга обязательнодолжна стоять на вашей книжной полке.Книга Яна Гойвертса и Стивена Левитана Регулярные выражения.
Сборник рецептов,2-е издание (Символ-Плюс, 2015 г.) - другой замечательный труд, особенно если речьидет о сравнении различных реализаций. Эту книгу вам также стоит иметь у себя.Книга Тони Стаблбайна Regular Expression Pocket Reference: Regular Expressions for Perl,Ruby, РНР, Python, С, Java and .Net (O'Reilly, 2007) - это 128-страничное руководство, которое, несмотря на сравнительно давний срок выхода в свет, и по сей день остается популярным.Книга Эндрю Уотта Beginning Regular Expressions (Wrox, 2005) была высоко оценена программистами.
Особенно полезным я считаю также онлайновое руководство по редакторуsed, написанное Брюсом Барнеттом (http://www. grymoire. com/Unix/Sed. html).В нем демонстрируется использование целого ряда нетривиальных средств, о которыхмною не было сказано ни слова.Инструменты, реапизации и бибпиотекиPerlPerl - популярный универсальный язык программирования. Для обработки текстов с помощью регулярных выражений многие предпочитают использовать именно Perl, а не какой-либо другой язык. Вероятно, он уже установлен на вашей машине, но при необходимости вы можете найти описание процедуры установки по адресуhttp://www.
perl. org/get. html. Информацию о регулярных выражениях Perl можнополучить здесь: http://perldoc. perl. org/perlre. html. Не поймите меня превратно. Существует множество других языков, которые прекрасно справляются с регулярнымивыражениями, но наличие Perl в вашем арсенале инструментов всегда себя окупит.PCREPerl CompatiЬle Regular Expressions, или PCRE (http://www. pcre. org), - это библиотека регулярных выражений, написанная на языке С (8- и 16-разрядная версии). Онасостоит главным образом из функций, которые могут вызываться в любой среде разработки С или в любом другом языке, допускающем использование библиотек С.
Какговорит само ее название, данная библиотека совместима с регулярными выражениямиPerl 5 и включает некоторые средства из других реализаций регулярных выражений. Библиотека PCRE используется в текстовом редакторе Notepad++.Утилита pcregrep - это 8-разрядный инструмент, подобный grep, позволяющий использовать возможности библиотеки PCRE в командной строке. Вы работали с ним в главе 3.Информацию о его загрузке (с сайта ftp://ftp. csx. cam. ас. uk/puЬ/software/programming/pcre/) можно найти по адресу http://www. pcre. org.
Его версиюдля компьютеров Мае можно загрузить на сайте Macports (http://www. macports. org),выполнив команду sudo port install pcre (требуется предварительная установка интегрированной среды разработки Xcode; для получения дополнительной информации обратитесьГnава 10. Конец начаnа117на сайт https: //developer. apple.com/technologies/tools/, вход на который возможен после прохождения процедуры регистрации). Для установки на платформе Windows(в виде двоичных файлов) перейдите по адресу http: //gnuwin32. sourceforge. net/packages/pcre.htm.Ruby (Oniguruma)Библиотека регулярных выражений Onigurwna входит в стандартный комплект поставкиRuby 1.9 (http: //oniguruma.rubyforge. org/).
Она написана на языке С специальнодля поддержки Ruby. Для знакомства с регулярными выражениями Ruby вполне подойдетвеб-приложение Rubular, поддерживающее версии 1.8.7 и 1.9.2 (http://www. rubular. сот;рис. 10.1). Кстати говоря, библиотека Oniguruma используется в TextМate - одном из самыхпопулярных текстовых редакторов для проrраммистов на Мае OS 10.Рис. 10.1. Использование регулярного выражениядля сопоставления с телефонным номером в RubularPythonPython (ht tp: / /www.
python. org) - универсальный язык программирования,поддерживающий регулярные выражения. Его создал Гвидо ван Россум в 1991 году. О регулярных выражениях Python 3 можно прочитать здесь:http://docs.python.org/pyЗk/library/re.html?highlight=regular%20expressionsRE2RE2 - это библиотека регулярных выражений, написанная на языке С++. Библиотекаобладает высокой производительностью, однако бектрекинr (перебор с возвратом) в нейне предусмотрен.
Таким образом, в ней отсутствуют средства для работы с обратными118Глава 10. Конец началассылками (более подробно об этом см. http:/ /code. google. com/p/re2). Библиотека доступна в виде пакета SPAN для Perl и в тех случаях, когда требуются обратные ссылки, позволяет обращаться к функциям собственной библиотеки Perl. Инструкции относительно тоrо, как организовать вызовы API, вы найдете по адресуhttp:/ /code. google.
com/p/re2/wiki/CplusplusAPI. Интересное обсуждение библиотеки RE2 содержится в статье "Regular Expression Matching in the Wild"(http://swtch.com/-rsc/regexp/regexpЗ. html).Сопоставяение с теяефонными номерамив формате, принятом в США и КанадеПомните пример с телефонным номером в формате, принятом в США и Канаде, который мы рассматривали в первой главе? С тех пор ваши знания регулярных выраженийзначительно углубились.Ниже приведено аналогичное регулярное выражение, отличающееся от прежнего выражения повышенной надежностью:л\(? (?: \d { 3 J ) \) ? [ - .
] ? (?: \d { 3}) [ - . ] ? (?: \d { 4} ) $Проверьте, как оно работает, воспользовавшись удобным для вас инструментом (видрезультата в Reggy представлен на рис. 10.2). Сейчас вы и сами способны разобратьсяв том, каково назначение каждого элемента приведенного выражения. Я горжусь вами.Но на всякий случай давайте сделаем это сообща.оГ)оReggyЛ\(?(?:\d{З})\)?[.-]?(?:\d{З})[.-]?(?:\d{4})$707-827-7019-(] hl•td'I AI! Q •<4.a:ctl UИ Q M1.1lt, n�-1M&tthfcv"1dРис. 10.2. Использование регулярного выражениядля сопоставления с телефонным номером в приложении ReggyГлава 10.