String Functions 字符串函数
使用表达式处理字符串数据
STRLEN ★
获取字符串长度,当字符串类型为 CHAR 时,尾部空格会被忽略,当字符串类型为 STRING 时,尾部空格不会被忽略,仍会按字符被计入长度内
例:
DATA(lv_strlen_c) = strlen( CONV char10( |1234567 | ) ).
DATA(lv_strlen_s) = strlen( CONV string( |ACDEFGH | ) ).
测试结果:
DISTANCE
计算将 text1 改动成 text2 的最少操作次数,每次操作仅允许删除/添加/更改 1 个字符
MAX 参数用来限制最大操作次数,当最少次数大于 max 时,返回 max
例:
DATA(lv_distance) = distance( val1 = '123ABC' val2 = '124AC' ).
DATA(lv_dis_max) = distance( val1 = '123ABC' val2 = '124ACDE' max = 3 ). ” “这里最小操作次数为4,但规定了max = 3,所以输出值为3
测试结果:
FIND ★
搜索指定字符串并计算偏移量,没有遍历到时返回 1-
可以使用 SUB ( 固定文本 ) 或者 REGEX ( 正则表达式 ) 作为指定条件进行搜索
CASE = [ abap_true | abap_false ]:大小写检查,默认需要检查大小写。case = abap_true需要检查大小写,case = abap_false不需要检查大小写,case = ‘ ’为case = abap_false。
DATA(lv_find_sub) = find( val = 'ABA123CAD' sub = 'a' case = ' ')."不区分大小写,查找到第一个值,输出为0
测试结果:
OCC = N:指定字符串在第 N 次出现,当 N 是负数时,从字符串右边开始遍历
DATA(lv_find_sub1) = find( val = 'ABA123CAD' sub = 'a' case = ' ' occ = 3 ).
"不区分大小写,搜索A第三次出现的位置,输出为7
DATA(lv_find_sub2) = find( val = 'ABA123CAD' sub = 'a' case = abap_true occ = 3 ).
"区分大小写,搜索A第三次出现的位置。没有结果,输出为1-
DATA(lv_find_sub3) = find( val = 'ABA123CAD' sub = 'a' case = abap_false occ = 1 ).
"不区分大小写,搜索A第一次出现的位置,输出为0
DATA(lv_find_sub4) = find( val = 'ABA123CAD' sub = 'A' occ = -3 ).
"若occ为负数,则从右边开始遍历,比如occ=-3,则从右边数第三个A,为左边数第一个A,偏移量为0 ,输出为0
DATA(lv_find_sub5) = find( val = 'ABA123CAD' sub = '8' ).
"遍历不到,输出为1-
DATA(lv_find_sub6) = find( val = 'ABA123CAD' sub = 'a' occ = 3 ).
" 这里没有写case,默认case区分大小写,输出为1-
测试结果:
OFF = N LEN = M:指定搜索区域,从第 N+1 为字符开始长度为 M 的范围
DATA(lv_find_reg) = find( val = 'ABA123CAD' regex = '\d' off = 0 len = 3 ).
"从第一个字符开始,搜索3个字符,查找数值。未查找到,输出为1-,"\d"在正则表达式中是数字
DATA(lv_find_reg1) = find( val = 'ABA123CAD' regex = '\d' off = 0 len = 6 ).
"从第一个字符开始,搜索六个字符,查找数字。第一个搜索出来的是1,偏移量为3,输出为3
DATA(lv_find_reg2) = find( val = 'ABA123CAD' regex = 'A' off = 0 len = 3 ).
"从第一个字符开始,搜索3个字符,查找A。偏移量为0,输出为0
DATA(lv_find_reg3) = find( val = 'ABA123CAD' regex = 'a' off = 0 len = 3 ).
"从第一个字符开始,搜索3个字符,查找a。未查找到a,输出为1-
DATA(lv_find_reg4) = find( val = 'ABA123CAD' regex = '123' off = 0 len = 6 ).
"从第一个字符开始,搜索6个字符,查找123。偏移量为3,输出为3
测试结果:
FIND_END
与 FIND 用法一致,但是偏移量会计算本身的长度
例:
DATA(lv_find_end_sub) = find_end( val = 'ABA123CAD' sub = 'A' occ = 3 ).
DATA(lv_find_end_reg) = find_end( val = 'ABA123CAD' regex = '\d+' ). "\d+"表示一个或多个数字组成
测试结果:
FIND_ANY_OF
搜索指定字符串中的任一字符并返回最小偏移量
FIND_ANY_NOT_OF
搜索非指定字符串中的任意字符并返回最小偏移量
以下两种表达式只能使用 SUB 指定文本,且始终区分大小写
例:
DATA(lv_find_any) = find_any_of( val = 'ABA123CAD' sub = '1B' ).
DATA(lv_find_any_not) = find_any_not_of( val = 'ABA123CAD' sub = '1B' ).
测试结果:
COUNT ★
用法与 FIND 类似,但是返回值是指定字符串出现的次数,因此不能指定 OCC 参数
COUNT_ANY_OF
计算指定字符串中的任一字符出现的总次数
COUNT_ANY_NOT_OF
计算非指定字符串中任意字符出现的总次数
例:
DATA(lv_count) = count( val = 'ABA123CAD' sub = 'a' case = ' ' ).
DATA(lv_count_any) = count_any_of( val = 'ABA123CAD' sub = '1B' ).
DATA(lv_count_not) = count_any_not_of( val = 'ABA123CAD' sub = '1B' ).
测试结果:
CONTAINS
用法与 FIND 类似,用于判断包含关系,返回值为布尔型数据
当指定 START/END 时,直接从左侧/右侧比较对应长度的字符,用来判断首尾字符是否是sub中的字符,使用正则表达式时不可指定
CONTAINS_ANY_OF
判断是否包含指定字符串中的任一字符
CONTAINS_ANY_NOT_OF
判断是否包含非指定字符串中的任意字符,只有当sub里拥有全部val中的字符时,才会报false
可参照部分与操作符等效的表达式用法,如下图:
例:
DATA(lv_contains) = xsdbool( contains( val = 'ABA123CAD' sub = 'a' case = ' ' ) ).
DATA(lv_contains_start) = xsdbool( contains( val = 'ABA123CAD' start = 'AB' ) ).
DATA(lv_contains_end) = xsdbool( contains( val = 'ABA123CAD' end = 'BD' ) ).
DATA(lv_contains_any) = xsdbool( contains_any_of( val = 'ABA123CAD' sub = 'E' ) ).
DATA(lv_contains_not) = xsdbool( contains_any_not_of( val = 'ABA123CAD' sub = '1B' ) ).
DATA(lv_contains_not1) = xsdbool( contains_any_not_of( val = 'ABA123CAD' sub = 'ABA123' ) )."true
DATA(lv_contains_not2) = xsdbool( contains_any_not_of( val = 'ABA123CAD' sub = 'ABA123CAD' ) )."false
测试结果:
XSDBOOL ★
将布尔型数据 true 转换为 abap_true,false 转换为 abap_false,返回值类型为 char1
REPLACE ★
替换字符串,可以指定位置进行替换,也可以查找指定字符串并替换
WITH = new 指定用于替换的字符串
OCC = N 指定字符串第 N 次出现时进行替换,N 为 0 时表示需要全部替换
其他参数可参照 FIND 表达式
例:
DATA(lv_replace) = replace( val = 'ABA123CAD' off = 0 len = 4 with = '@12@' ).
DATA(lv_replace_sub) = replace( val = 'ABA123CAD' sub = 'a' with = '@' case = ' ' ).
DATA(lv_replace_reg) = replace( val = 'ABA123CAD' regex = '\d' with = '#' occ = 0 ).
测试结果:
INSERT ★
插入字符串,可以使用 OFF 指定插入的位置,默认为 0
例:
DATA(lv_insert) = insert( val = 'ABCD' sub = '123' off = 2 ).
测试结果:
SPLIT
拆分字符串字符串,可以将字符串拆分开来
例:
DATA: STRING(60),
P1(20) VALUE '',
P2(20) VALUE '',
DEL(3) VALUE '***'.
STRING = ' Part 1 *** Part 2'.
SPLIT STRING AT DEL INTO P1 P2.
WRITE: /'P1:' , P1.
WRITE: /'P2:' , P2.
测试结果:
CONCATENATE
连接字符串,可以将字符串连接起来,如例1
SEPARATED BY 可以在字符间增加连接符,如例2
例1:
DATA: C1(10) VALUE 'Summer',
C2(10) VALUE 'holiday ',
C3(30).
CONCATENATE C1 C2 INTO C3.
测试结果:
例2:
DATA: C1(10) VALUE 'Summer',
C2(10) VALUE 'holiday ',
C3(30),
SEP(3) VALUE ' - '.
CONCATENATE C1 C2 INTO C3 SEPARATED BY SEP.
测试结果: