Главная » XSLT » РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ

0

Какого бы разра­ботчика на XSLT я ни спрашивал, добавление регулярных выражений в XSLT стояло в верхней позиции его списка из 10 наиболее желательных усовершен­ствований. Эта врезка предназначена для тех программистов, которые еще не имели удовольствия работать с регулярными выражениями или побаиваются их. Справочник не исчерпывающий, но для начала его хватит.

Регулярное выражение – это строка, содержащая образец для сопоставления с другой строкой. Простейший образец – литеральная строка, то есть строка «foo» тоже считается регулярным выражением. Оно может быть сопоставлено, к приме­ру, строке «foobar», начиная с первого символа. Но истинная мощь регулярных вы­ражений проявляется, когда вы включаете специальные метасимволы, распозна­ваемые языком.

Ниже перечислены наиболее распространенные метасимволы.

?          Точка (.) сопоставляется с любым одиночным символом.

?          Класс символов ([aeiou], [a-z] или [A-Z]) сопоставляется с одиноч­ным символом, принадлежащим одному или нескольким диапазонам.

?          Для некоторых классов символов имеются специальные сокращения. На­пример, \s – сокращенная запись класса символов пропуска, к которым относятся пробел, а также знаки табуляции, новой строки и возврата ка­ретки, а \d – сокращение для класса [0-9]. Часто для сокращения, вклю­чающего символ обратной косой черты и строчную букву, имеется парное сокращение с заглавной буквой; оно инвертирует сопоставление. Так, например, \S сопоставляется с любым символом, отличным от пропуска, а \D – со всеми символами, кроме цифр. Впрочем, это не универсальное правило. К примеру, \n сопоставляется с символом новой строки, но \N не означает сопоставления с любым символом, кроме новой строки (то же самое относится к обозначениям \t – табуляция и \r – возврат каретки).

?          Можно инвертировать класс символов, поставив в начале знак Л. Например, [Aaeiou] сопоставляется с любым символом, кроме строчных гласных букв. Это относится и к диапазонам; [Л0-9] – то же самое, что \D.

?          Литералы и метасимволы часто встречаются в сочетании. Например, d[aeiou]g сопоставляется со словами «dag», «deg», «dig», «dog» и «dug», а также с любой строкой, содержащий одну из вышеуказанных в качестве подстроки.

?          Не менее важны метасимволы повторения, с помощью которых производится сопоставление с предшествующим им регулярным выражением, которое встречается несколько раз.

?          Метасимвол * означает, что предыдущее выражение может встречаться

0           или более раз. Следовательно, be* сопоставляется со строками «Ь», «be», «bee», «beee» и так далее. Выражение (10)* сопоставляется со строками «10», «1010», «101010» и так далее. Здесь скобки применяются для группирования. Если скобки удалить, останется выражение 10*, так что символ повтора будет применяться только к цифре 0.

?          Метасимвол + означает, что предыдущее выражение может встречаться

1           или более раз. Следовательно, be+ сопоставляется со строками «be», «bee», «beee» и так далее, но не со строкой «b».

?          Метасимвол ? означает, что предыдущее выражение может встречаться 0 или 1 раз. Следовательно, be? сопоставляется только со строками «ь» и «be».

?          Очень часто бывает необходимо точно указать, в каком месте строки может происходить сопоставление с регулярным выражением. В частности, нередко требуется, чтобы сопоставление происходило только в начале (л) или в конце ($) строки, а иногда нужно, чтобы строка считалась подходящей, если она начинается с образца и им же заканчивается. Например, выражение Abe + сопоставляется со строкой «bee keeper», но не со строкой «has been». Выражение be + $ сопоставляется со строкой «to be or not to be», но не со строкой «be he alive or be he dead». И, наконец, выражение Abe+$ сопоставляется со строками «be» и «bee», но не со строками «been» или «Abe».

?          Представленные до сих пор конструкции позволяют решить большинство задач на сопоставление с образцом, с которыми вам придется столкнуться. Но есть еще и контекстно-зависимые сопоставления, для которых простых регулярных выражений недостаточно. Предположим, что нужно найти числа, начинающиеся и заканчивающиеся одной и той же цифрой (11, 909, 3233 и т.д.). Регулярные выражения в чистом виде с такой задачей не справятся, но в большинстве языков, в том числе и в XPath 2.0, реализованы расширения, позволяющие решить ее.

? Для применения описываемого механизма необходимо сделать две вещи. Во-первых, ту часть образца, на которую вы хотите в дальнейшем сослаться, нужно специально пометить как запоминаемую группу, для чего служат круглые скобки. А, во-вторых, на эту группу следует сослать­ся по номеру. Например, выражение (\d)\d*\1 сопоставляется с лю­бым числом, которое начинается и заканчивается одной и той же циф­рой. В данном случае группа состоит из одной цифры (\d), а ссылка на нее имеет вид \1, то есть «первая сопоставленная группа». Вы, навер­ное, уже догадались, что групп может быть несколько, например, (\d)(\d)\1\2. Такое выражение сопоставляется с числами вида «1212» и «9999», но не с «1213» или «1221». Обратные ссылки \1, \2 и т.д. применяются в функции matches(), включенной в XPath 2.0. Похо­жая нотация, в которой вместо знака \ используется $, зарезервирована для случаев, когда ссылка встречается вне регулярного выражения. Это характерно для функции replace(), в которой нужно сослаться на груп­пы, описанные в регулярном выражении поиска, из регулярного выра­жения замены. Например, replace($someText, ‘(\d)\d*)’, ‘$1′) за­меняет первую последовательность из одной или более цифр в строке $someText первой цифрой этой последовательности. Этот механизм доступен также из команды xsl:analyze-string. Подробнее мы рас­смотрим его в рецептах 2.6 и 2.10.

Если вы захотите более глубоко познакомиться с регулярными выражения­ми, обратите внимание на книгу Jeffery E.F. Friedl Mastering Regular Expressions, Second Edition (O’Reilly, 1999)1. Если вас интересуют особенности регулярных выражений в XSLT 2.0, познакомьтесь с книгой Michael Kay XPath 2.0 (Wrox, 2004) или с рекомендациями консорциума W3C по адресу http://www.w3.org/TR/ xquery-operators#string.match и http://www.w3.org/TR/xmlschema-2#regexs.

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии