Получить совпадения оператора FIND OF REGEX - PullRequest
0 голосов
/ 18 июня 2019

Я бы не только проверял строку на наличие вхождения подстроки с помощью регулярных выражений, но также получал бы результат ("45" в моем примере) найденного регулярного выражения.

Я пытался:

 DO.
    FIND FIRST OCCURRENCE OF REGEX '[$][0-9]+[$]' IN 'safmaoigrevnwnfuwifhd$45$sdffge' 
        MATCH OFFSET lv_match_offset MATCH LENGTH lv_match_len 
        SUBMATCHES DATA(s1) DATA(s2) DATA(s3).
    IF sy-subrc = 0.
      " I expected s2 to contain the value between the "$"
      lv_match-value = s2.
      " remove found substring from annotation name for next loop
      lv_annotation_name = lv_annotation_name+lv_match_offset(lv_match_len).
    ELSE.
      EXIT.
    ENDIF.
  ENDDO.

s1, s2 и s3 всегда начальные, но почему? Я думал, что они будут содержать значение найденного регулярного выражения, например, «$», «45», «$». Что я делаю неправильно? Есть ли более элегантный способ, чем мой подход?

Следуя совету Сандры, я изменил код на

FIND ALL OCCURRENCES OF REGEX lv_index_regex IN lv_annotation_name RESULTS lt_matches. 

Обратите внимание, что FIND ALL ... MATCHES не существует, я предположил, что Сандра означает "РЕЗУЛЬТАТЫ". lt_matches затем содержит itab submatches, но всегда пусто ....

Спасибо

1 Ответ

4 голосов
/ 18 июня 2019

Слово SUBMATCHES в выражении FIND [FIRST OCCURRENCE OF] REGEX используется для непосредственного извлечения зарегистрированных подгрупп (...) (подсовпадения AKA) совпадения в переменные.

Итак, простопоместите несколько скобок вокруг каждого из них:

FIND FIRST OCCURRENCE OF REGEX '([$])([0-9]+)([$])' 
    IN 'safmaoigrevnwnfuwifhd$45$sdffge' 
    MATCH OFFSET lv_match_offset 
    MATCH LENGTH lv_match_len 
    SUBMATCHES DATA(s1) DATA(s2) DATA(s3).

Обратите внимание, что ваш код будет выполнять бесконечный цикл, но это другой вопрос (будет проще найти все совпадения одновременно с помощью FIND ALL OCCURRENCES OF REGEX ... RESULTS itab и выполнить цикл ввнутренняя таблица, каждая строка соответствует одному совпадению, и каждая строка также содержит список подсовпадений).

...