转自:https://www.cnblogs.com/jiangzhengjun/p/4292994.html#_Toc411766043
REPLACE
REPLACE [{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF]
{[SUBSTRING] sub_string} | {REGEX regex}
IN [SECTION [OFFSET off] [LENGTH len] OF] dobj
WITH new
[IN {BYTE|CHARACTER} MODE]
[{RESPECTING|IGNORING} CASE]
[REPLACEMENT COUNT rcnt]
{ {[REPLACEMENT OFFSET roff]
[REPLACEMENT LENGTH rlen]}
| [RESULTS result_tab|result_wa] }.
语法与FIND相似。
如果new尾部空格需要保留,则要使用String类型的new,其他固定长度类型的new字符,会忽略掉尾部空格。
{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF
FIRST OCCURRENCE或者未指定时,只替换第一次匹配的;ALL OCCURRENCES则替换所有子匹配串
{[SUBSTRING] sub_string} | {REGEX regex}
[SUBSTRING] sub_string:以固定的字符串为匹配模式进行搜索并替换,与前面替换指定的字符串的REPLACE是一样的。
FIRST OCCURRENCE或者未指定时,如果sub_string是空String类型的字符串或者内容为空格的固定长度类型(c, d, n, or t)的字符串时,sub_string将会被看作是empty 类型的字符串,并且查找替换的位置将定位到dobj的首字符前,并且将new插入到dobj最前面。但如果sub_string是空字符串(包括字符类型字符串类型),使用ALL OCCURRENCES选项,则会抛异常。
sub_string为固定长度类型的字符串时,尾部空格将被忽略(这与老式的REPLACE规则不同),如果不想忽略尾部空格,则使用String类型的sub_string。
REGEX regex:使用正则表达式进行匹配替换。
regex不允许为空String类型的字符串或者内容只有空格的固定长度类型(c, d, n, or t)的字符串。
DATA text TYPE string VALUE '-uu-'.
"U*表示0个或多个U,当为0个时,字符间的空隙就相匹配"U*与UU相匹配,替换的结果为第三个 x
REPLACE ALL OCCURRENCES OF REGEX 'u*' IN text WITH 'x'.
WRITE:/ text.
x-xx-x
IN [SECTION [OFFSET off] [LENGTH len] OF] dobj
如果未加上SECTION选项,将对整个dobj字符串进行匹配替换操作。如果指定了SECTION选项,则OFFSET与LENGTH必须选择一个。如果指定如果指定了OFFSET,但未指定LENGTH时,替换的区域从OFFSET到dobj的最后;如果指定了LENGTH,但未指定OFFSET时,OFFSET将隐含为0。OFFSET与LENGTH需要大于或等于0,通过OFFSET与LENGTH定位到的子字符串段必须要位于dobj里。该选项与前面替换某个区间上的字符串的REPLACE是一样的,与FIND也相同。
[{RESPECTING|IGNORING} CASE]
区分与忽略大小写,对在 IN CHARACTER MODE 模式下使用,默认区别大小写
[REPLACEMENT COUNT rcnt]
成功替换的次数,如果没有发生替换,则为0
注:如果dobj为固定长度类型的字符串时,则发生替换的次数 rcnt 可能少于本应该查找到的次数。
[REPLACEMENT OFFSET roff]
最后一次替换发生在 dobj 中的起始位置,如果没有发生替换,则保留的是以前的值。
[REPLACEMENT LENGTH rlen]
最的一次dobj替换完成后替换结果段的长度(注:不是指查到的sub_string长度的,而是指定成功替换后被插入部分的长度,这与FIND函数是不一样的,这里一般等于 new 的长度),如果没有发生替换,则保留的是以前的值。
注:如果dobj为固定长度类型的字符串时,rlen可能小于 new 的长度。
关于rcnt变少、rlen变小的示例:
DATA: text(9) VALUE 'aaacccccc'.
DATA: roff TYPE i, rlen TYPE i,rcnt TYPE i.
REPLACE ALL OCCURRENCES OF 'ccc' IN text WITH 'ddd'
REPLACEMENT COUNT rcnt
REPLACEMENT OFFSET roff
REPLACEMENT LENGTH rlen.
"ddd: 2 6 3 替换值 new 未被截断且后面还有未进行替换处理的字符串(ccc),继续查找与替换
"dddd: 2 7 2 替换值 new 未被截断且后面还有未进行替换处理的字符串(cc),继续查找与替换
"ddddd: 2 8 1 替换值 new 未被截断且后面还有未进行替换处理的字符串(c),继续查找与替换
"dddddd: 1 3 6 替换值 new 未被截断但后面不再有其他字符串,所以不再查找与替换(替换次数1小于本应该查找到的次数2,因为在经过第1次替换后,被替代后面的所有字符串都会被截断,下面也是一样道理)
"ddddddd: 1 3 6 替换值 new 被截断,所以不再查找与替换
WRITE: / rcnt, / roff, / rlen.
[RESULTS result_tab|result_wa]
如果发生了替换操作,则替换的起始位置、匹配到的字符串长度都会存储到一个行结构为result_wa的result_tab内表中,与FIND中的RESULTS result_tab选项意思相当,只是result_tab and result_wa的类型为REPL_RESULT_TAB or REPL_RESULT,并且REPL_RESULT里没有内嵌SUBMATCHES:
image071[4]
替换指定位置
DATA: text1 TYPE string,
text2 TYPE c LENGTH 18,
off TYPE i,
len TYPE i.
text1 = text2 = 'I know you know'.
"先查找位置:查找第一次匹配位置
FIND 'know' IN text1 MATCH OFFSET off
MATCH LENGTH len.
"再根据指定位置替换
REPLACE SECTION OFFSET off LENGTH len OF:
text1 WITH 'should know that',
text2 WITH 'should know that'.
"text2替换后被截断
WRITE: / text1,/ text2 , sy-subrc.
I should know that you know
I should know that 2
DATA: text1 TYPE string,
cnt TYPE i,
off TYPE i,
len TYPE i.
text1 = 'I know you know'.
REPLACE ALL OCCURRENCES OF 'know' IN
SECTION OFFSET 11 LENGTH 4 of"在11~14索引范围内匹配替换
text1 WITH 'should know that'
REPLACEMENT COUNT cnt"发生的替换次数
REPLACEMENT OFFSET off"最后一次发生替换的位置
REPLACEMENT LENGTH len.
WRITE: / text1, cnt, off,len.
I know you should know that 1 11 16