在abap中如何使用正则规则快速还原JSON字符串转译
问
在json字符串中,将会对所有特殊符号(如"、\、[、]等等)进行字符串转译,变成\"、\\\、\\[、\\],当使用时需要将这些转译字符串进行还原。
传统方式需要针对所有出现的转译字符串可能情况进行归纳,每种情况都写一个replace语句进行转译替换,步骤繁琐且效率低下,如何使用正则表达式快速还原?
答
示范代码:
返回结果:
示例解释:
在标准语法find()与replace()中,可以使用正则方法,分别对字符串针对某一规则(使用正则代码进行描述)进行匹配查询或者替换。除此之外,在
count()、contains()、 find()、 match()、 matches()、
replace()、substring()等abap主函数(部分主函数仅适用S4后新语法)中可以使用,以及
CL_ABAP_REGEX与CL_ABAP_MATCHER两个类中也可以使用regex参数。如示例中,就是使用replace()语法使用正则规则进行字符串替换。
result = replace ( val = text regex = '\\\\(?:(\S))' with = '$1' occ
= 0 ).
其中,result表示返回结构,即替换后的字符串;val表示源字符串,即未处理的字符串;regex表示正则匹配规则;with表示正则替换规则;occ表示是否为全量更新,默认为0,表示全量。
在abap中,正则规则与常用的正则规则存在一定差异,但总体上也属于大同小异。正则匹配的基本规则都是由“匹配字符{出现次数}”进行匹配。
其中匹配字符包括正常字符如“A、B、C、a、b、c”等等;也包括一些需要在前方添加“\”的转译特殊字符如“\"、\\\、\\[、\\]”等等;以及一些字符合集代码,如下表所示:
匹配次数包括“1、2、3”等等,表示前方字符出现次数;也可以不加,表示默认为1次;以及一些特殊使用,如下表所示:
除此之外,在整个正则匹配字符串中,还包括部分特殊字符表示一些特殊场景,如下表所示:
如示例所示,在regex参数中,“\\\”表示转译特殊符号“\”;“(?:(…))”在匹配中不存在实际含义,而是将括号中内容进行非捕获分组,与后面替换部分with中的“$”所呼应;“\S”属于正则的特殊单字符匹配,表示任何一个非空白字符。结合occ=0来看,意思为匹配到所有字符串text中所有“\”后跟着一个任意非空白字符的字符串。
在with参数中,“$1”表示第1分组,若无明确捕获分组代码,即为regex中第一个“(?:(…))”。由于实例中只有一个“(?:(…))”,故而它就是第1分组。然后由于只存在“$1”,故舍弃掉原表达式中的“\”符号。
结合整体来看,整个with的作用即为匹配到text中所有“\”后跟着一个任意非空白字符的字符串如“\"、\\\、\\[、\\]”等等,替换为去掉“\”的字符串“"、\、[、]”。
作者:丁 空 淦
审核:贾栋才
编辑:朱思聪