String Functions 字符串函数
CMAX/CMIN
返回数个字符串中的最大值/最小值,最多可以有 9 个参数,比较规则:按 0 - 9 ,A - Z,a - z 的顺序从小到大
例:
DATA(lv_cmax) = cmax( val1 = 'aABC' val2 = 'ZABC' val3 = '0123' ).
DATA(lv_cmin) = cmin( val1 = 'aABC' val2 = 'ZABC' val3 = '0123' ).
测试结果:
CONDENSE ★
压缩字符串,默认会移除头部/尾部的空格,其他部分的空格都会被压缩至 1 位
DEL = del 指定需要删除的字符,指定后,从字符串两侧开始遍历并删除字符,直到出现非指定字符
FROM = from TO = to 处理完 DEL 后,再遍历字符串,将 from 中出现的字符,替换成 to 的第一位字符
在遍历过程中,当同一个字符连续出现时,会被当成一个整体进行替换,所有字符均区分大小写
例:
DATA(lv_condense_space) = condense( | This is test | ).
DATA(lv_condense) = condense( val = ' XXThis ISSS X sTringXX'
del = |X |
from = 'TS'
to = 'to' ).
测试结果:(存在问题,第二个不是这样)
CONCAT_LINES_OF ★
将内表中所有的记录连接起来,通过 sep 指定分隔符
例:
DATA: lt_data TYPE TABLE OF char10.
lt_data = VALUE #( ( 'ABC' ) ( '123' ) ( 'DEF' ) ).
DATA(lv_concat_lines) = concat_lines_of( table = lt_data sep = '@' ).
测试结果:
ESCAPE
基于规则转义特定字符,FORMAT 用于指定转换规则
例:
DATA(lv_escape_url) = escape( val = 'http://www.google.com'
format = cl_abap_format=>e_url_full ).
DATA(lv_escape_string) = escape( val = 'Special characters: |, \, {, }'
format = cl_abap_format=>e_string_tpl ).
测试结果:
MATCH ★
根据正则表达式匹配字符,如果在字符前后增加“.”,怎可以将字符前后的字符一起输出。
DATA(lv_match) = match( val = 'S1S2H3H4' regex = 'S.' occ = 2 ). "S2,第二次出现的S,“.”是S后面的一个字符
DATA(lv_match1) = match( val = 'S1S2H3H4' regex = 'H...' occ = 1 ). "H3H4
DATA(lv_match2) = match( val = 'S1S2H3H4' regex = 'H.' occ = 6 ). "不出现值,因为没有第6个H
DATA(lv_match3) = match( val = 'S1S2H3H4' regex = '1.' occ = 1 ). "1S
DATA(lv_match4) = match( val = 'S1S2H3H4' regex = 'S' occ = 1 ). "S
测试结果:
REPEAT
循环字符串 N 次
例:
DATA(lv_repeat) = repeat( val = 'ABC' occ = 5 ).
测试结果:
REVERSE ★
字符串反转
例:
DATA(lv_reverse) = reverse( 'DEMO' ).
测试结果:
TRANSLATE
按照指定规则替换字符,from 和 to 中的字符一一对应,没有对应关系的字符会被删除
如下例,Y对应A,Z对应C,B没有对应则被删除
DATA(lv_translate) = translate( val = 'ABCDAB'
from = 'ACB'
to = 'YZ' ).
测试结果:
下例中,1、2都没有对应,则val中的1和2都被删除
data(lv_translate2) = translate( val = '1234511223'
from = '12'
to = ''"输出3453
测试结果:
TO_MIXED
处理大小写格式,首个字符大小写与 CASE 参数中的第一个字符一致,从第二个字符开始转换成小写
sep 符号(默认为 _ )后面的一个字符会被转换成大写,min 可以指定前 N 位中的 sep 符号不起作用
DATA(lv_to_mixed) = to_mixed( val = 'THIS is @A STRIN@G' sep = '@' case = 'X' min = 10 ).
"输出This is @a strinG
DATA(lv_to_mixed1) = to_mixed( val = 'THIS is A STRIN@G' case = 'x' min = 10 ).
"输出this is a strin@g ,这里因为没有sep的值,所以后面的min也没有任何作用
DATA(lv_to_mixed2) = to_mixed( val = 'HEllo worLD' case = 'x').
"输出hello world
DATA(lv_to_mixed3) = to_mixed( val = 'HEllo w_orLD' sep = '_' case = 'x').
"输出hello wOrld
DATA(lv_to_mixed4) = to_mixed( val = 'HE_llo w_orLD' sep = '_' case = 'x' min = 2 ).
"输出heLlo wOrld
DATA(lv_to_mixed5) = to_mixed( val = 'HE_llo w_orLD' sep = '_' case = 'x' min = 3 ).
"输出he_llo wOrld
data(lv_to_mixed6) = to_mixed( val = '@HEllo worLD' sep = '@' case = 'x').
"输出@hello world,首字母当sep和case冲突的时候,以case为准
data(lv_to_mixed7) = to_mixed( val = '@HEllo worLD' case = 'x' sep = '@').
"输出@hello world
data(lv_to_mixed8) = to_mixed( val = 'H@Ello worLD' sep = '@' case = 'x').
"输出hEllo world,要是sep生效,则生效的sep在输出中消失
data(lv_to_mixed9) = to_mixed( val = 'HE@llo worLD' sep = '@' case = 'x').
"输出heLlo world
测试结果:
FORM_MIXED
处理大小写格式,大小写与 CASE 参数中的第一个字符一致(默认大写),在转换前字符是大写的,会在该字符之前添加 sep 符号
DATA(lv_from_mixed) = from_mixed( val = 'This IS a string' )."输出THIS _I_S A STRING
DATA(lv_from_mixed1) = from_mixed( val = 'This IS a string' case = 'x' )."输出this _i_s a string
data(lv_from_mixed2) = from_mixed( val = 'hello worLD' )."输出HELLO WOR_L_D
测试结果:
TO_UPPER/TO_LOWER ★
将字符串转换成大写/小写
例:
DATA(lv_to_upper) = to_upper( val = 'this IS a string' ).
DATA(lv_to_lower) = to_lower( val = 'THIS IS A STRING' ).
测试结果:
SHIFT_LEFT/SHIFT_RIGHT
将字符串左移/右移 N 位
指定 CIRCULAR 参数时,每次移除的字符需要被添加到另一侧
指定 SUB 参数时,如果 SUB 与字符串左侧/右侧部分字符完全匹配,则移除这些字符
例:
DATA(lv_left_places) = shift_left( val = 'ABCD’ places = 2 ).
DATA(lv_left_circular) = shift_left( val = 'ABCD' circular = 3 ).
DATA(lv_left_sub) = shift_left( val = 'ABCD' sub = 'A' ).
DATA(lv_right_places) = shift_right( val = 'ABCD' places = 2 ).
DATA(lv_right_circular) = shift_right( val = 'ABCD' circular = 3 ).
DATA(lv_right_sub) = shift_right( val = 'ABCD' sub = 'D' ).
测试结果:
以下表达式可以用来截取字符串
SUBSTRING ★
从第 off + 1 位开始取长度为 len 的字符串,如果截取范围超出原有字符长度,会抛出异常CX_SY_RANGE_OUT_OF_BOUNDS
SUBSTRING_FROM
从指定文本 sub 或是正则表达式 regex 匹配到的字符串(包含本身)开始截取,默认截至最后一位
len 指定长度,occ 指定出现次数,case 指定大小写检查,case = abap_true 检查大小写,case = abap_false不检查大小写
DATA(lv_substring_from) = substring_from( val = 'ABCDEFGH' sub = 'DEF' )."DEFGH
DATA(lv_substring_from1) = substring_from( val = 'ABCACBABC' sub = 'A' len = 2 )."AB
DATA(lv_substring_from2) = substring_from( val = 'ABCACBABC' sub = 'A' occ = 2 )."ACBABC
DATA(lv_substring_from3) = substring_from( val = 'ABCaCABABC' sub = 'a' case = abap_true )."aCABABC
DATA(lv_substring_from4) = substring_from( val = 'AbBCbabBC' sub = 'B' case = abap_false ).
"bBCbabBC,当case = abap_false时,不检查大小写
DATA(lv_substring_from5) = substring_from( val = 'ABCbabBC' sub = 'b' case = abap_false )."BCbabBC
DATA(lv_substring_from6) = substring_from( val = 'ABCaCaABABC' sub = 'a' len = 2 occ = 2 case = abap_true )."aA
DATA(lv_substring_from7) = substring_from( val = 'ABCaCaABABC' sub = 'A' len = 3 occ = 3 case = abap_true )."ABC
测试结果:
SUBSTRING_AFTER
从指定文本后一位开始截取,不包含本身
DATA(lv_substring_after) = substring_after( val = 'ABCDEFGH' sub = 'DEF' )."GH
DATA(lv_substring_after1) = substring_after( val = 'ABCDEFGH' sub = 'eF' case = abap_false )."GH
DATA(lv_substring_after2) = substring_after( val = 'ABCDEFGH' sub = 'g' )."g不在字符中,所以没有数据
测试结果:
SUBSTRING_BEFORE
从第一位字符开始,截取到指定文本前一位,不包含本身
DATA(lv_substring_before) = substring_before( val = 'ABCDEFGH' sub = 'DEF' )."ABC
data(lv_substring_before1) = substring_before( val = '1234' sub = '34' )."12
测试结果:
SUBSTRING_TO
从第一位字符开始,截取到指定文本结束,包含本身
DATA(lv_substring_to) = substring_to( val = 'ABCDEFGH' sub = 'DEF' )."ABCDEF
data(lv_substring_to1) = substring_to( val = '12345' sub = '34' )."1234
测试结果:
SEGMENT ★
根据分隔符获取指定位置的字符串,可以用来拆分字符串,INDEX 用来指定位置,指定位置不存在时,会抛出异常 CX_SY_STRG_PAR_VAL
通过 SEP 指定的分隔符会被当做一个整体进行操作,当分隔符连续出现时,该位置会返回空字符串;
而通过 SPACE 指定的分隔符中,每个字符都会被视作单独的分隔符,且在分隔符连续出现时也不会单独返回空串
例:
DO.
TRY.
lv_sep = segment( val = 'AB;CD ;EF ; ;GH'
index = sy-index
sep = ' ;' ).
CATCH cx_sy_strg_par_val.
EXIT.
ENDTRY.
ENDDO.
DO.
TRY.
lv_space = segment( val = 'AB CD - EF_GH'
index = sy-index
space = ' -_' ).
CATCH cx_sy_strg_par_val.
EXIT.
ENDTRY.
ENDDO.
测试结果: