获取FIND OF REGEX语句的子匹配

时间:2019-06-18 08:40:53

标签: regex find sap abap

我不仅会使用正则表达式检查字符串是否存在子字符串,还会获得找到的正则表达式的结果(在我的示例中为“ 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不存在,我认为Sandra的意思是“ RESULTS”。 lt_matches然后包含itab submatches,但它始终为空。...

谢谢

1 个答案:

答案 0 :(得分:4)

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

因此,只需在每个括号中加上一些括号即可:

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一次查找所有匹配项并在内部表中循环比较容易,每一行是一个匹配项,而每个行还包含子匹配项列表)。