我不仅会使用正则表达式检查字符串是否存在子字符串,还会获得找到的正则表达式的结果(在我的示例中为“ 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
,但它始终为空。...
谢谢
答案 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
一次查找所有匹配项并在内部表中循环比较容易,每一行是一个匹配项,而每个行还包含子匹配项列表)。