文章目录
一、字符串函数参数详解
Ps: find 函数返回搜索参数的一个特定匹配项的位置。
- val:指定函数要处理的文本字符串
- sub:指定函数要搜索或插入的字符串
data(result1) = find( val = 'ABAPabapABAP' sub = 'A' ). " return 0
- case:指定字符串搜索或比较时,是否区分大小写 ( abap_true 区分大小写、abap_false 不区分大小写 )
data(result2) = find( val = 'ABAPabapABAP' sub = 'a' case = abap_false ). " return 0
data(result3) = find( val = 'ABAPabapABAP' sub = 'a' case = abap_true ). " return 4
- occ:在执行搜索的字符串函数中,该参数指定匹配项的出现。正数从左侧计算出现次数、负数从右侧计算出现次数。
" 搜索字符 A 在字符串中第三次出现的位置
data(result4) = find( val = 'ABAPabapABAP' sub = 'A' occ = 3 ). " return 8
" 搜索字符 A 在字符串中最后一次出现的位置
data(result5) = find( val = 'ABAPabapABAP' sub = 'A' occ = -1 ). " return 10
- off:用于传递偏移量
- len:用于传递长度
" 偏移量等于4,则从第5个字符开始搜索
data(result6) = find( val = 'ABAPabapABAP' sub = 'A' off = 4 ). " return 8
" 偏移量等于4 且传递长度为4,则搜索子串 abap,结果是找不到匹配项
data(result7) = find( val = 'ABAPabapABAP' sub = 'A' off = 4 len = 4 ). " return -1
二、描述函数(Description Functions)
2.1、长度函数(Length Functions)
numofchar / strlen: 返回字符串的长度
Q:numofchar 和 strlen 有什么区别呢?
A:若参数是 string 类型,且后面带多个空格。则 strlen 的结果包含这些空格,而 numofchar 的结果不包含这些空格。若参数是 C 或者 N 类型,一般后面的空格都不参与计算。
示例1:参数是 C 类型:
data var_char type c length 10 value `ABAP `.
data(result1) = numofchar( var_char ). " return 4
data(result2) = strlen( var_char ). " return 4
示例2:参数是 String 类型:
data var_string type string value `ABAP `.
data(result1) = numofchar( var_string ). " return 4
data(result2) = strlen( var_string ). " return 5
2.2、搜索函数(Groups of Search functions)
count:返回搜索参数出现的次数
count_any_of:返回搜索参数中的字符出现的次数
count_any_not_of:返回未出现在搜索参数中的字符出现的次数
Q:count_any_of、count_any_not_of 与 count 的区别是什么?
A:在示例代码中,使用 count 函数,会将整个 sub 作为匹配项(比如:BA 作为匹配项)。使用 count_any_of 或 count_any_not_of 则将 sub 中的每个字符视为匹配项(比如:B 和 A 作为单独的匹配项)。
data(result1) = count( val = 'ABAP' sub = 'BA' ). " return 1
data(result2) = count_any_of( val = 'ABAP' sub = 'BA' ). " return 3
data(result3) = count_any_not_of( val = 'ABAP' sub = 'BA' ). " return 1
find:返回搜索参数的一个特定匹配项的位置
find_any_of:返回搜索参数中的字符的一个特定匹配项的位置
find_any_not_of:返回未出现在搜索参数中的字符的一个特定匹配项的位置
Q:find_any_of、find_any_not_of 与 find 的区别是什么?
A:在示例代码中,使用 find 函数,会将整个 sub 作为匹配项(说明:BA 作为匹配项)。使用 find_any_of 或 find_any_not_of 则将 sub 中的每个字符视为匹配项(说明:B 和 A 作为单独的匹配项)。
data(result4) = find( val = 'ABAP' sub = 'BA' ). " return 1
data(result5) = find_any_of( val = 'ABAP' sub = 'BA' ). " return 0
data(result6) = find_any_not_of( val = 'ABAP' sub = 'BA' ). " return 3
三、处理函数(Processing Functions)
3.1、字符大小写转换
to_upper / to_lower:大小写
data(result1) = to_upper( 'HelLo' ). " Return HELLO
data(result2) = to_lower( 'HeLlO' ). " Return hello
to_mixed / from_mixed:大小写混合形式
对于 to_mixed 函数,参数 sep 指定分隔符,函数会将分隔符删除,将分隔符后的第一个字符转换为大写,其余转换为小写。若没有在 sep 指定分隔符,则默认是 ‘_’。分隔符可以是多个字符组合而成。 from_mixed 函数在大写字母前面添加分隔符,并将字符串转换为大写。
data(result3) = to_mixed( val = 'ABAP_is_cool' sep = `_` ). " Return AbapIsCool
data(result4) = from_mixed( val = 'AbapIsCool' sep = '_' ). " Return ABAP_IS_COOL
3.2、改变字符顺序
reverse:以相反的顺序返回字符串
data(result0) = reverse( val = 'abcd' ). " return dcba
shift_left / shift_right:按指定的位数(向左/向右)移动字符串中字符
shift_left 函数中,参数 places 指定需要删除的字符数,而参数 circular 指定前几个字符移动到末尾。shift_right 函数中,数 places 指定需要删除的字符数,而参数 circular 指末尾几个字符移动到头部。参数 places 和 circular 不能一起指定。
data(result1) = shift_left( val = 'abcdefg' places = 2 ). " return cdefg
data(result2) = shift_left( val = 'abcdefg' circular = 2 ). " return cdefgab
data(result3) = shift_right( val = 'abcdefg' places = 2 ). " return abcde
data(result4) = shift_right( val = 'abcdefg' circular = 2 ). " return fgabcde
3.3、截取字符串
substring:截取指定长度的子串
data(result1) = substring( val = '##ABAP_is_cool' off = 2 len = 4 ). " return ABAP
substring_to / substring_before:截取搜索参数之后的子串
substring_from / substring_after:截取搜索参数之前的子串
data text type string value '##ABAP_is_cool'.
data(result2) = substring_before( val = text sub = 'is' ). " return ##ABAP_
data(result3) = substring_after( val = text sub = 'is' ). " return _cool
data(result4) = substring_to( val = text sub = 'is' ). " return ##ABAP_is
data(result5) = substring_from( val = text sub = 'is' ). " return is_cool
3.4、其他函数
segment:按分隔符分割字符串
参数 sep 指定分隔符,它会根据分隔符对字符串进行分段,参数 index 指定需要返回第几个分段的内容。
data(result6) = segment( val = '##ABAP_is_cool' sep = '_' index = 2 ). " return is
condense:删除字符串中的空格
它会删除头部或末尾的空格,中间的空格只保留一位。
data(result7) = condense( val = ` Your name ` ). " return Your name
repeat:返回重复 N 次后的字符串
参数 occ 指定字符串重复的次数。
data(result8) = repeat( value = 'Repeat ' occ = 2 ). " return RepeatRepeat
replace:替换字符串中的子串
它会用 with 的值替换 sub 的值,occ 等于0,则替换所有出现的子字符串。
data(result9) = replace( val = '##ABAP_is_cool' sub = '#' with = space occ = 0 ). " return ABAP_is_cool
四、谓词函数(Predicate Functions)
contains:字符串中是否包含指定的字串
Ps: 若 sub 中指定的子串在字符串中至少出现一次,则返回 true,否则返回 false。
IF contains( val = 'ABAP' sub = 'ba' case = abap_false ). " return true
ENDIF.
contains_any_of、contains_any_not_of:字符串中是否包含(或者不包含)指定子串中的字符
Ps: 对于 xxx_any_of 或 xxx_any_not_of 则将 sub 中的每个字符视为匹配项。
IF contains_any_of( val = 'ABAP' sub = 'ABC' ). " return true
ENDIF.
IF contains_any_not_of( val = 'ABAP' sub = 'DK' ). " return true
ENDIF.
matches:将字符串与正则表达式进行比较
五、正则表达式
正则表达式(Regex)是用于描述字符串集合的模式,广泛应用于文本搜索、替换操作以及字段内容验证等场景。它通过包含字面量和特殊字符,提供比普通字符串搜索更强大的搜索能力。正则表达式的语法有标准化,但不同实现之间存在差异,如 Perl 和 POSIX 标准、XPath 和 XSD 的语法差异。在 ABAP 中,常用的是 Perl 兼容正则表达式(PCRE)标准,其他标准和语法也被支持。
5.1、常用的语法元素
- 字面量:最简单的正则表达式形式
- 字符集:通过方括号指定一个字符集,例如 [BS]
- 字符范围:通过连字符指定范围,如 B-D
- 排除字符集:通过 ^ 排除特定字符,如 [^LX]
- 通配符
.
:匹配任何字符 - 量词
{}
:指定字符或组的重复次数,例如 {3} 或 {1,2} - 分组
()
:用于将多个元素组合成一个单元,配合量词使用。 - 联合操作符
|
:用于组合两个模式,允许它们同时匹配。
5.2、可以使用正则表达式的字符串函数
- find:子串 AB 或 AP 在字符串中第一次出现的位置
DATA(result1) = find( val = '##ABAP_is_cool' pcre = 'A(B|P)' ). " Return 2
- count:子串 AB 或 AP 在字符串中出现的次数
DATA(result2) = count( val = '##ABAP_is_cool' pcre = 'A(B|P)' ). " Return 2
- contains:字符串是否包含了子串 AB 或者 AP
IF contains( val = '##ABAP_is_cool' pcre = 'A(B|P)' ). " return true
ENDIF.
- replace:将字符串中所有的空格替换为常量
space
DATA(result4) = replace( val = `F la s h ` pcre = '\s' with = space occ = 0 ). " Return Flash
- substring_*
- matches
- match
Ps:这是我自己在学习过程中的一篇简单笔记,内容主要来自于SAP Learning Hub 的课程 Acquiring Core ABAP Skills,如果你想要了解更多的字符串函数以及用法,可以查阅 ABAP - Keyword Documentation,里面提供了非常详细的解释。补充一点:不用特意去记忆这些方法,只需要有大概的印象即可,真正要用到时,再查阅 Keyword Documentation 即可。