ABAP基础-字符串处理

1.概述

字符数据(又称字串)指的是广义的字符类型(包括C,N,D,T和String等类型)数据对象。对于字符串数据,ABAP提供了一些特有的操作语句,这些操作在处理数据对象时不进行类型转换,一律照C类型对待。

2. 处理字符串数据

1.连接字符串,使用CONCATENATE
CONCATENATE s1 ... sn INTO s_dest [SEPARATED BY sep].

该语句连接字串s1...sn并将结果赋给s_dest,其中s_dest也可以是s1...sn中的某个变量。选项SEPARATED BY 用于指定一个字串作为分隔符,在构成新字串时插入在s1...sn之间。如果连接后的长度超过了目标数据定义长度,则把截断赋给c。如结果出现截断情况,SY-SUBRC返回4,否则该值返回0.要避免截断,可以将将c定义为String,该类型长度自适应。

REPORT z_data_manipulation.
DATA: s1(9)  TYPE c VALUE 'Fristname',
      s2(10) TYPE c VALUE 'Secondname',
      s3(20),
      sep(1) TYPE c VALUE '.'.

CONCATENATE s1 s2 INTO s3.
WRITE / s3.
CONCATENATE s1 s2 INTO s3 SEPARATED BY sep.
WRITE / s3.
INTO

2.拆分字符串,使用SPLIT
SPLIT s_source AT sep INTO s1...sn.

该语句在源字串中搜索分隔符sep,并根据该分割符将元字串拆成各个小串放到目标字段s1 ... sn中,这些子串不包括分隔符。与连接语句类型,如结果出现截断情况,SY-SUBRC返回4,否则该值返回0。如果源子串能够拆分的子串多过指定数目,则源子串最后剩余部分包括其后的分割符都将写入最后一个子串,要避免这种情况,需要使用内表进行操作。
SPLIT s_source AT sep INTO TABLE itab.

REPORT z_data_manipulation.
DATA : text TYPE string,
       itab TYPE TABLE OF string.

text = 'ABAP is a programming language'.
SPLIT text  AT space INTO TABLE itab.
LOOP AT  itab INTO text.
  WRITE / text.
ENDLOOP.

语句LOOP AT用于循环输出内表的每一行数据。


SPLIT

3.查找子串模式
在一个字符串中查找一个子字符串模式,使用SEARCH语句
SEARCH c FOR str.

改语句在字段c中查找字符串str。如果找到,则将SY-SUBRC返回0,SY-FDPOS返回字段c中该字符串的位置(从做算起的字节偏移量),否则将SY-SUBRC返回4。所谓模式是指要查找的字串不一定与str完全一致,可以设定忽略或保留str末尾的空格,或利用通配符“*”扩大其查找灵活性,由下列几种模式:

  • str 搜索str并忽略尾部空格
  • .str. 搜索str,但是不忽略尾部空格
  • *str 搜索以str结尾的单词
  • str* 搜索以str开始的单词
REPORT z_string_search.
DATA string(30) TYPE c VALUE 'This is a testing sentence.'.
WRITE: / 'Searched', 'SY-SUBRC', 'SY-FDPOS'.

SEARCH string FOR 'X'.
WRITE: / 'X', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.

SEARCH string FOR 'itt   '.
WRITE: / 'itt   ',sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.

SEARCH string FOR '.e .'.
WRITE: / '.e .', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.

SEARCH string FOR '*e'.
WRITE: / '*e ', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.

SEARCH string FOR 's*'.
WRITE: / 's*', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.
SEARCH

4.替换字段内容,使用REPLACE语句。
REPLACE str1 WITH str2 INTO s_dest [LENGTH len].

该语句对字段s_dest进行搜索,如果在其中出现了字符串str1,则用str2替换第一次出现的部分。如果未指定长度,则搜索整个s_dest。如果指定长度len,则只搜索前len个字节。如果字段SY-SUBRC返回0,则说明已经替换;非0则意味着未进行替换。

REPORT z_string_replace.
DATA name TYPE string.

name = 'Michael-Cheong'.
WHILE sy-subrc = 0.
  REPLACE '-' WITH ' ' INTO name.
ENDWHILE.
WRITE / name.
REPLIACE

5.确定字段长度,不包括结尾空格,使用STRLEN,语句将操作数str作为字符数据类型处理,不考虑实际类型,也不进行转换
[COMPUTE] n = STRLEN( str ).

REPORT z_string_strlen.
DATA: text(24) TYPE c VALUE 'ABAP Language',
      len      TYPE i.

len = strlen( text ).
WRITE: / 'Length of', text, 'is', len.
strlen

6.其他操作

  • SHIFT 将字符串整体或子串进行位移
  • CONDENSE 删除字符串中的多余空格
  • TRANSLATE 字符转换,例如将ABC转换为abc
  • CONVERT TEXT 创建一个可以排序的格式
  • OVERLAY 用一个字符串覆盖另一个字符串
  • WRITE TO 赋值时,将忽略数据对象类型,将其视为字符类型数据

3. 字符数据比较

字符型逻辑表达式用于判断两个字符串之间的包含关系

运算符 含义
s1 CO s2 如果s1仅包含s2中的字符,则逻辑表达式为真
s1 CN s2 如果s1包含s2之外的其他字符,则逻辑表达式为真
s1 CA s2 如果s1包含任何一个s2中的字符,则逻辑表达式为真
s1 NA s2 如果s1不包含s2的任何字符,则逻辑表达式为真
s1 CS s2 如果s1包含字符串s2,则逻辑表达式为真
s1 NS s2 如果s1不包含字符串s2,则逻辑表达式为真
s1 CP s2 如果s1包含模式s2,则逻辑表达式为真
s1 NP s2 如果s1不包含模式s2,则逻辑表达式为真

CO,CN,CA,NA比较时要区分大小写,并且尾部空格也在比较的范围之内;使用CS,NS,CP,NP比较时忽略尾部空格并且比较不区分大小写。比较结束后,如果结果为真,系统字段SY-FDPOS将给出s2在s1中偏移量信息。

REPORT z_string_replace.
DATA: s1 TYPE string,
      s2 TYPE string.
s1 = 'SAP ABAP'.
s2 = 'ABAP'.

IF s1 CS s2.
  WRITE: / s2, 'is in Position', sy-fdpos,
  'of', s1, 'Stirng'.
ENDIF.
字符串比较

CP和NP被称为模式比较逻辑表达式,意义在于可以使用通配符。
“*”用于替代任何字符串,“+”用于替代任何单个字符。
如需对大小写或尾部空格进行区分比较,需要将换码字符“#”放到相应的字符前。下面列出可以使用“#”指定的功能:

  • 大小写字符,指定大小写(如#A,#b)
  • 通配符“”(输入#),将其转回原意
  • 通配符“+”(输入#+),将其转回原意
  • 换码符号本身(输入##),将其转回原意
  • 字符串结尾的空格(输入#_),指定比较结尾空格

3 定位操作子串

仅操作指定的部分子串。s [+o][(1)]
其意义是对字段s从第o位开始(从0开始偏移)且长度为1的部分执行该语句操作。如果未指定长度,则对字段s第o和结尾之间的所有位进行处理。

REPORT z_string_replace.
DATA: f1(8)  VALUE 'ABCDEFGH',
      f2(20) VALUE '12345678901234567890'.
f2+6(5) = f1+3(5).
WRITE : / f1, / f2.
定位操作

通常,必须将偏移量和长度指定为无符号数。然而,一下情况中可以使用变量动态指定:

  • 用MOVE语句或赋值运算符给字段赋值时
  • 用WRITE TO语句向字段携入值时
  • 用ASSIGN将字段分配给字段符号时
  • 用PERFORM将数据传送给子程序时

对字符类型,数值文本字段,十六进制字段,日期和时间字段指定偏移量是有意义的;类型F,I,P数值字段则不要使用指定偏移量。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容