获取 FIND OF REGEX 语句的子匹配项

Get submatches of FIND OF REGEX statement

我不仅会使用正则表达式检查字符串中是否出现任何子字符串,还会得到找到的正则表达式的结果(在我的示例中为“45”)。

我试过:

 DO.
    FIND FIRST OCCURRENCE OF REGEX '[$][0-9]+[$]' IN 'safmaoigrevnwnfuwifhd$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 不存在,我假设 Sandra 的意思是 "RESULTS"。 lt_matches 然后包含 itab submatches 但它总是空的....

语句FIND [FIRST OCCURRENCE OF] REGEX中的单词SUBMATCHES用于直接将匹配的registered subgroups (...)(A.K.A.子匹配)提取到变量中。

因此,只需在它们中的每一个周围加上一些括号:

FIND FIRST OCCURRENCE OF REGEX '([$])([0-9]+)([$])' 
    IN 'safmaoigrevnwnfuwifhd$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 一次查找所有匹配项并在内部 table 处循环会更容易,每行是一个匹配项,每一行还包含子匹配项的列表)。