REPLACE 语法

转自: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
原文地址:https://www.cnblogs.com/rainysblog/p/10815789.html