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

Регулярные выражения - это шаблоны для поиска в строках. Их можно
использовать для поиска, замены в строках или проверки входных данных. ABAP разработчики не очень часто используют данный функционал, хотя иногда это довольно удобно. К сожалению, и сам язык поддерживает далеко не все возможности регулярных выражений.

Нет смысла лишний раз описывать операторы, ознакомится с ним можно в документации.

Рассмотрим несколько простых примеров для поиска на конкретных примерах. Так будет немного понятнее.

Для работы с регулярными выражениями в ABAP есть оператор REGEX.
В первом примере найдем позицию буквы ‘t’. Тут все достаточно просто

Но на практике скорее всего придется искать не заренее известное значение, а некоторое значение из диапазона.  Допустим, нам надо найти числа в строке. Это будет выглядеть вот так:

В lt_result_tab получим позиции цифр 32, 2, 55.
Как это работает:
1. [ ] - означает диапазон значений, в нашем случае это от 0 до 9.
2. +   - повтор шаблона от 1 раза

a)Регулярное выражение последовательно ищет первый символ, который удовлетворяет первой позиции в шаблоне. "F" - не подходит, "r" - не подходит ...., "3" - подходит.
б) Далее в шаблоне идет «+», который означает, что предыдущий шаблон нужно искать от 1 до бесконечности раз подряд. Значит в следующей позиции опять происходит поиск значения 0-9. Находим следующий символ результата - «2»
в)Переходим к следующему символу в строке – это пробел. «Пробел» не входит в диапазон искомых значений, значит все, что хотели мы нашли
г) Сохраняем результат в таблицу
в)Начинаем поиск заново, с участка строки на котором закончили.
..... Продолжаем итерации пока строка не закончится

Замечание
Но abap не был бы абапом если бы не поддерживал какую то странную версию регулярных выражений. Поэтому шаблон '[0-9]' даст нам такой же результат как и '[0-9]+'. Хотя, по хорошему, должен выдать 3, 2, 2, 3, 3. Скорее всего причина в том, что в ABAP используется только жадный алгоритм.

В предыдущем примере, можно заметить, что двойка это часть слова summa_2  и не является отдельным числом. Давайте найдем  только отдельностоящие цифры. Для этого немного усложним выражение

В lt_result_tab получим позиции цифр 32, 55
\<  - символ начала слова. Означает, что следующий за ним элемент шаблона будем искать только если слово с него начинается.

Хорошо, а что если числа будут дробные ? Причем, нам надо найти только числа,  у которых дробная часть имеет два символа.

{n} – находит ровно n совпадений указанного элемента
{n,} – находит n  и более совпадений указанного элемента
 или как в нашем случае {n,m} –от n до m совпадений указанного элемента

Перед точкой можем увидеть знак «\»  - это экранирование элемента. Т.к. символ «.» является специальным символом и означает любой символ, а мы ищем именно точку. «\.» - как раз говорит, что ищем символ точка.

\> - найденный символ должен быть концом слова. Что позволяет исключить из выборки 32.5656, например.

Алгоритм:
1. «\<» - говорит, что мы осуществляем поиск элемента шаблона с начала слова:

  • Первое слово – «summa_1»;
  • Анализируем первый символ. Он должен быть в диапазоне [0-9];
  • Слово начинается на «s» и нам не подходит;
  • Идем дальше и ищем новое слово по нашему шаблону (шаблон отрабатывает с самого начала);
  • Слово «32.5656»;
  • Анализируем первый символ. Он должен быть в диапазоне [0-9]. Так и есть;
  • «+» - говорит о том, что символ может повторяться от 1 до n раз. Значит второй символ в слове подходит под наш шаблон;
  • Переходим к анализу третьего символа в слове «.» Это не цифра – значит сдвигаемся по шаблону на следующее условие, а это у нас «\.» что соответствует «.» в строке;
  • Переходим к анализу следующего символа после точки - «5». В шаблоне мы тоже сместились на поиск символа от [0-9]. Пятерка нам подходит;
  •  Анализируем следующий символ «6». Он тоже должен быть [0-9], т.к. мы прописали, что данный элемент должен повторяться два раза. Но при этом «\>»говорит, что данный элемент должен быть концом слова. В нашем слове следующий элемент «5»;
  • Слово под шаблон не подходит;
  • Опять пробуем найти совпадение по шаблону с самого начала (Ему удовлетворяет только 32.56 )

Еще немного усложним шаблон, что если мы не знаем, разделяются разряды «.» или «,»

В результате получим «32,56», «66,88» .
Алгоритм поиска точно такой же как и в прошлый раз, за тем исключением, что добавился оператор x|y – который ищет или x или y.

Думаю, что в целом, как работают выражения понятно. 

Для работы с регулярными выражениями существуют классы CL_ABAP_MATCHER и CL_ABAP_REGEX. Их удобно использовать, например, в условиях.

Пример проверки, что в строке только числа и пробелы. 

^ - начало входных данных;
$ - конец входных данных;
Означает, что наша шаблон должен от начала и до конца удовлетворять тому, что находится между знаками ^ и $.

Проверка, что введенные данные являются email:

Также можно менять значения  в строках
Удаление лишних пробелов:

Алгоритм:
\s  - символ пробела;
{2,} –повторение предыдущего символа 2 и более раз подряд.

Один из самых популярных примеров - замена формата  даты:

Алгоритм:
\d – любое число;
(x) «круглые скобки» – запоминание x;
$1, $2… - найденные зарегестрированные группы.

Удаление всех символов в начале строки перед From:


Все довольно просто, но требуется тренировка. Сделать это можно в программе DEMO_REGEX_TOY

UPD.
Переосмысленные регулярки

 

 

 

 

 

Регулярные выражения в ABAP: 1 комментарий

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

Добавить комментарий

Ваш адрес email не будет опубликован.