ABAP-正则表达式的运用
在SAP中可以运行DEMO_REGEX和DEMO_REGEX_TOY程序来验证正则表达式
也可以通过regexr-cn.com和regex101.com这两个网址来验证正则表达式
在ABAP中定义了两个类来实现相应功能,分别是CL_ABAP_REGEX 和CL_ABAP_MATCHER
正则表达式的说明:
表达式 | 说明 |
a* | a出现零次或多次 |
a+ | a出现一次或多次 |
a? | a出现零次或一次 |
a{6} | a出现六次 |
a{2,6} | a出现两次到六次 |
a{2,} | a出现两次或以上 |
a|b | 匹配a或b |
[abc] | 匹配a或b或c |
[a-f] | 匹配a到f的英文字母 |
[a-zA-Z0-9] | 匹配小写a-z、大写A-Z和0-9的数字 |
[^0-9] | 匹配不是0到9的数字 |
\d | 匹配数字字符 |
\D | 匹配非数字字符 |
\w | 匹配单词字符(英文、数字、下划线) |
\W | 匹配非单词字符 |
\s | 匹配空白字符(包含换行符和Tab) |
\S | 匹配非空白字符 |
. | 匹配任意字符(换行符除外) |
\b | 匹配字符边界 |
\B | 匹配非字符边界 |
\ | 转义字符 |
^ | 匹配行首 |
$ | 匹配行尾 |
.+ | 贪婪匹配(匹配最长的) |
.+? | 懒惰匹配(匹配最短的) |
() | 1.括号中的表达式可以作为整体被修饰 2.在取匹配结果时可以将括号的数据单独取出 |
(?:) | 匹配但是不捕获 |
\数字 | 数字引用,匹配分组结果 |
(?=) | 正向预搜索,判断当前位置右侧是否能匹配指定表达式 |
(?!) | 正向预搜索否定,判断当前位置右侧是否不能够匹配指定表达式 |
(?<=) | 反向预搜索,判断当前位置左侧是否能够匹配指定表达式 |
(?<!) | 反向预搜索否定,判断当前位置左侧是否不能够匹配指定表达式 |
[:alnum:] | 匹配任何一个字母或数字(A-Z、a-z、0-9) |
[:alpha:] | 匹配任何一个字母(A-Z、a-z) |
[:cntrl:] | 匹配任何一个控制字符(\x00-\x1F、\x7F) |
[:digit:] | 匹配任何一个数字(0-9) |
[:xdigit:] | 匹配任何一个16进制数 |
[:space:] | 匹配任何一个空白字符(\x09-\x0D、\x20) |
[:graph:] | 匹配任何一个可显示的ASCII字符,不包含空格 |
[:lower:] | 匹配任何一个小写字母(a-z) |
[:upper:] | 匹配任何一个大写字母(A-Z) |
[:punct:] | 匹配任何一个标点符号 |
[:blank:] | 空格或者制表符(\x20、\x09) |
在程序中可以运用正则表达式来验证,查找和替换
1 *正则表达式验证 2 IF cl_abap_matcher=>matches( 3 pattern = '^(^[\-0-9][0-9]*(.[0-9]+)?)$' 4 text = '1.01a' ) = abap_true. 5 WRITE '数字'. 6 ELSE. 7 WRITE '非数字'. 8 ENDIF.
1 *正则表达式查找 2 DATA: lv_string TYPE string VALUE '广东省珠海市香洲区中山路'. 3 4 DATA: lt_result TYPE TABLE OF match_result, 5 wa_result TYPE match_result. 6 7 FIND ALL OCCURRENCES OF PCRE '(.+?[省])?(.+?[市])?(.+?[区])?(.*)?' IN lv_string IGNORING CASE RESULTS lt_result. 8 9 LOOP AT lt_result INTO wa_result WHERE offset >= 0 . 10 WRITE:/ lv_string+wa_result-offset(wa_result-length). 11 ENDLOOP. 12 13 ULINE. 14 *读取捕获的分组值 15 LOOP AT lt_result INTO wa_result. 16 DATA(lt_submatches) = wa_result-submatches. 17 LOOP AT lt_submatches INTO DATA(wa_submatches) WHERE offset >= 0. 18 WRITE:/ lv_string+wa_submatches-offset(wa_submatches-length). 19 ENDLOOP. 20 ENDLOOP.
1 *正则表达式替换 2 DATA text TYPE string VALUE '-hubinshishuibuzhidao-'. 3 REPLACE ALL OCCURRENCES OF PCRE 'sh.?i' IN text WITH 'FFF'. 4 WRITE:/ text.