:::: МЕНЮ ::::

Регулярные выражения в ABAP

Регулярное выражение (Regular expression, REGEX) — механизм поиска подстроки в тексте по предопределенному шаблону. Использование регулярных выражений имеет смысл в случаях когда у нас нет четкого понимания того, что нужно найти. К примеру, если стоит задача найти в тексте определенное слово или фразу, то подойдет обычный поиск подстроки. А когда требуется найти неизвестный e-mail или последовательность из 25-ти английских букв или цифр, например XXXXX-XXXXX-XXXXX-XXXXX-XXXXX, то без регулярных выражений просто не обойтись.

Синтаксис регулярных выражений

Регулярное выражение состоит из паттерна — строки задающей правило поиска, также иногда называют шаблоном или маской. Паттерны могут состоять как из обычных символов, так и из спецсимволов (метасимволов). Например паттерн ‘ABAP’ состоит только из обычных символов, а паттерн ‘A.\w{2}’ содержит как простой символ ‘A’, так и спец. символы ‘.’, ‘\w’ и ‘{2}’. Рассмотрим спецсимволы более подробно.

Экранирование символов

Спецсимвол Значение Пример
\ Делает спецсимволы обычными, а обычные специальными. Выражение ‘s’ ищет просто символ ‘s’, а если поставить \ перед s, то ‘\s’ уже обозначает пробельный символ. И наоборот, ‘a*’ ищет 0 или больше подряд идущих символов ‘a’, а чтобы найти а со звездочкой ‘a*’ — поставим \ перед спец. символом: ‘a\*’.

Символьные классы (наборы символов)

Спецсимвол Значение Пример
. (точка) Произвольный символ ‘a.’ найдет ‘ab’ и ‘ap’ в ‘abaper’
\C Произвольный символ Тоже самое что и (точка).
\d Цифра от 0 до 9 ‘\d’ найдет ‘4’ в ‘abap4
\D Любой символ кроме цифры ‘\D’ найдет точку в ‘3.1415′
\l Любая буква в нижнем регистре
\L Любой символ кроме буквы в нижнем регистре
\s Любой пробельный символ (обычно пробел или табуляция)
\S Любой символ кроме пробельного
\u Любая буква в верхнем регистре
\U Любой символ кроме буквы в верхнем регистре
\w Обозначает любую букву, цифру и символ _
\W Любой символ кроме буквы, цифры и символа _
[xyz] Набор символов. Находит любой из перечисленных символов. ‘[a\d]’ найдет две ‘a’ и ‘4’ в ‘abap4
[^xyz] Любой символ, кроме указанных в наборе ‘[^a\d]’ найдет ‘b’ и ‘p’ в ‘abap4′
[a-d] Диапазон символов [a-d] — то же самое, что [abcd]
\a \f \n \r \t \v Соответствующие контрольные символы
[..] Не используется. Зарезервировано для дальнейших улучшений.
[==] Не используется. Зарезервировано для дальнейших улучшений.

Квантификация (поиск последовательностей)

Спецсимвол Значение Пример
{n} Находит ровно n повторений предшествующего элемента ‘[1-4]{3}’ найдет ‘141’ в ‘3.1415926′
{n,m} Находят от n до m повторений элемента ‘[1246]{2,3}’ найдет ‘141’ и ’26’ в ‘3.1415926
{n,} Находит n и более повторений элемента ‘\d{2,}’ найдет ‘1415926’ в ‘3.1415926
{n,m}? Не используется. Зарезервировано для дальнейших улучшений.
? Обозначает, что элемент может как присутствовать, так и отсутствовать Тоже самое что и {0,1}
* Обозначает повторение 0 или более раз Тоже самое что и {0,}
*? Не используется. Зарезервировано для дальнейших улучшений.
+ Обозначает повторение 1 или более раз Тоже самое что и {1,}
+? Не используется. Зарезервировано для дальнейших улучшений.
x|y Находит x или y ‘ab|p’ найдет ‘ab’ и ‘p’ в ‘abap
(x) Находит x и запоминает. Это называется «запоминающие скобки». ‘(b|s)a’ найдет ‘sa’ и ‘ba’ в ‘sap abap’
(?:x) Находит x, но не запоминает найденное. Это называется «незапоминающие скобки».
\1, \2, \3 … Найденные, с помощью «запоминающих скобках», группы. ‘(\+).*\1’ найдет ‘+ google +’ в ‘Apple + google +
\Q … \E Определение строки буквенных символов
(? … ) Не используется. Зарезервировано для дальнейших улучшений.

Позиция внутри строки

Спецсимвол Значение Пример
^ Обозначает начало входных данных. ‘^sap’ найдет ‘sap’ в ‘sap abap’ но ничего не найдет в ‘abap sap’
\A Обозначает начало символьной строки. Тоже самое что и ^
$ Обозначает конец входных данных. ‘sap$’ найдет ‘sap’ в ‘abap sap‘ но ничего не найдет в ‘sap abap’
\Z Обозначает конец символьной строки. Тоже самое что и $
\< Начало слова ‘\<\w’ найдет ‘s’ и ‘a’ в ‘sap abap’
\> Конец слова ‘\w\>’ найдет две ‘p’ в ‘sap abap
\b Начало или конец слова ‘\w?\b\w?’ найдет ‘s’, ‘a’ и две ‘p’ в ‘sap abap
\B Пробел между символами в слове
x(?=y) Находит x, только если за x следует y. ‘\S(?=a)’ найдет символ, если после него идет ‘a’, например ‘sap abap’
x(?!y ) Находит x, только если за x не следует y. ‘a(?!p)’ найдет ‘a’ в ‘sap abap’

Замена текста

Спецсимвол Значение Пример
$0, $& Найденное местоположение шаблона Замена ‘abap’ на ‘+$0+’ в тексте ‘sap abap’ даст ‘sap +abap+’
$1, $2, $3… Найденные зарегистрированные подгруппы Замена ‘([0-3]\d)\.([01]\d)\.(\d{4})’ на ‘$3-$2-$1’ в тексте ‘01.02.2010’ даст ‘2010-02-01’
$` Текст перед найденного шаблона
$’ Текст после найденного шаблона

Инструменты для работы с регулярными выражениями

ABAP предоставляет возможность использовать регулярные выражения в конструкциях FIND и REPLACE, добавляя ключевое слово REGEX.
Например, для поиска даты в формате DD.MM.YYYY, можно использовать FIND REGEX.

Результат данной операции будет помещен во внутреннюю таблицу match_result.
А для замены формата даты DD.MM.YYYY на формат YYYY-MM-DD можно использовать REPLACE REGEX.

Помимо FIND и REPLACE, механизм регулярных выражений реализован в классах CL_ABAP_REGEX и CL_ABAP_MATCHER. Классы позволяют более гибко использовать регулярные выражения.
Выражения FIND и REPLACE и методы классов CL_ABAP_REGEX и CL_ABAP_MATCHER хорошо задокументированы в документации SAP.

Тестирование

Для тестирования регулярных выражений в SAP используйте стандартную программу DEMO_REGEX_TOY
Тестирование регулярных выражений в программе DEMO_REGEX_TOY


8 комментариев

Присоединиться к обсуждению...