使用 ABAP 内置函数和正则表达式处理字符串

文章目录

一、字符串函数参数详解

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、常用的语法元素

  1. 字面量:最简单的正则表达式形式
  2. 字符集:通过方括号指定一个字符集,例如 [BS]
  3. 字符范围:通过连字符指定范围,如 B-D
  4. 排除字符集:通过 ^ 排除特定字符,如 [^LX]
  5. 通配符 .:匹配任何字符
  6. 量词 {}:指定字符或组的重复次数,例如 {3} 或 {1,2}
  7. 分组 ():用于将多个元素组合成一个单元,配合量词使用。
  8. 联合操作符 |:用于组合两个模式,允许它们同时匹配。
    在这里插入图片描述

5.2、可以使用正则表达式的字符串函数

  1. find:子串 AB 或 AP 在字符串中第一次出现的位置
DATA(result1) = find( val = '##ABAP_is_cool' pcre = 'A(B|P)' ).   " Return 2
  1. count:子串 AB 或 AP 在字符串中出现的次数
DATA(result2) = count( val = '##ABAP_is_cool' pcre = 'A(B|P)' ).   " Return 2
  1. contains:字符串是否包含了子串 AB 或者 AP
IF contains( val = '##ABAP_is_cool' pcre = 'A(B|P)' ).    " return true
ENDIF.
  1. replace:将字符串中所有的空格替换为常量 space
DATA(result4) = replace( val = `F la s h ` pcre = '\s' with = space occ = 0 ).  " Return Flash
  1. substring_*
  2. matches
  3. match

Ps:这是我自己在学习过程中的一篇简单笔记,内容主要来自于SAP Learning Hub 的课程 Acquiring Core ABAP Skills,如果你想要了解更多的字符串函数以及用法,可以查阅 ABAP - Keyword Documentation,里面提供了非常详细的解释。补充一点:不用特意去记忆这些方法,只需要有大概的印象即可,真正要用到时,再查阅 Keyword Documentation 即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值