Регулярное выражение (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.
1 2 3 |
FIND ALL OCCURRENCES OF REGEX '[0-3]\d\.[01]\d\.\d{4}' IN text RESULTS match_result. |
Результат данной операции будет помещен во внутреннюю таблицу match_result.
А для замены формата даты DD.MM.YYYY на формат YYYY-MM-DD можно использовать REPLACE REGEX.
1 2 3 |
REPLACE ALL OCCURRENCES OF REGEX '([0-3]\d)\.([01]\d)\.(\d{4})' IN text WITH '$3-$2-$1'. |
Помимо FIND и REPLACE, механизм регулярных выражений реализован в классах CL_ABAP_REGEX и CL_ABAP_MATCHER. Классы позволяют более гибко использовать регулярные выражения.
Выражения FIND и REPLACE и методы классов CL_ABAP_REGEX и CL_ABAP_MATCHER хорошо задокументированы в документации SAP.
Тестирование
Для тестирования регулярных выражений в SAP используйте стандартную программу DEMO_REGEX_TOY
Полезная инфа, спасибо.
Пожалуйста. Рад был помочь.
Очень пригодилось. Всё понятно, спасибо!
Пожалуйста
Большое спасибо!
Проверять на https://regex101.com/ удобнее. К тому же там есть отладчик.
Спасибо, я правильно понимаю что в старыхверсиях abap (моя sap версия 40B) вообще никаких регулярных выражений?
Регулярные выражения появились довольно давно. Проще всего узнать — это вставить код и проверить.