Использование регулярных выражений¶
Задача¶
Вы слыхали о том, что регулярные выражения – это новый мощный инструмент, появившийся в XSLT 2.0, но не знаете, как применить эту мощь для своих нужд.
Решение¶
Сопоставление с текстовыми образцами¶
Важнейшее применение регулярные выражения находят при сопоставлении с текстовыми образцами. Воспользовавшись функцией matches()
в правиле шаблона, можно выполнить сопоставление с текстом узла:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Можно также выполнять сопоставление в командах xsl:if
и xsl:choose
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Выделение лексем в стилизованном тексте¶
Часто регулярные выражения применяются для разбиения строки на лексемы:
(: Выделить из даты в формате ISO (YYYY-MM-DDhh:mm:ss
) год, месяц и день, представив их в виде последовательности :)
1 |
|
(: Выделить из даты в формате ISO (YYYY-MM-DDhh:mm:ss
) год, месяц, день, часы, минуты и секунды представив их в виде последовательности :)
1 |
|
(: Разбить предложение на слова :)
1 |
|
Замена и расширение текста¶
Есть два способа применения функции replace()
, входящей в состав XPath. Во-первых, можно просто заменить найденные образцы другим текстом. Иногда образец заменяется пустой строкой (''
), поскольку найденный текст нужно удалить.
(: Заменить день месяца в дате в формате ISO на 01 :)
1 |
|
(: Убрать из даты в формате ISO все компоненты, кроме года :)
1 |
|
При втором способе использования replace вы вставляете текст в место, где произошло сопоставление с образцом, не изменяя самого сопоставленного фрагмента. Возможно, тот факт, что функция, называемая replace (заменить), может выполнять вставку текста, и противоречит интуиции, но именно такого результата позволяют добиться обратные ссылки.
(: Вставить пробел после знаков препинания, за которыми не следует пробел :)
1 |
|
Анализ текста для преобразования в формат XML¶
Еще более мощной, чем функции tokenize()
и replace()
, является появившаяся в XSLT 2.0 команда xsl:analyze-string
. Она позволяет не просто выполнять подстановки в тексте, но строить на основе текста XML-содержимое.
Обсуждение¶
Регулярные выражения – это настолько богатый и мощный инструмент обработки текста, что им можно было бы посвятить целую книгу. И такие люди нашлись. Книга Джеффри Фридла «Регулярные выражения» (издательство «Питер», 2003) – классическое сочинение на эту тему, я ее настоятельно рекомендую.
Важность регулярных выражений проистекает из умения сопоставлять текст с образцами. Интересно, что сопоставление с образцами – это и основа мощи языка XSLT. Но если XSLT идеально приспособлен для поиска образцов в структуре XML-документа, то регулярные выражения оптимизированы для работы с произвольным текстом. Однако язык регулярных выражений сложнее языка выражений XPath, используемого внутри XSLT. Это неизбежно просто потому, что произвольному тексту недостает древовидной структуры, характерной для XML.
Ключ к овладению регулярными выражениями – практика и разумное заимствование идей из примеров выражений, написанных другими людьми. Помимо книга Фридла, примеры можно найти в книгах по языку Perl и на сайте RegExLib.com.