ABAP基础-08 字符串处理 - 重点

这篇博客主要介绍了ABAP中的字符串处理,包括连接、拆分、查找、替换等基本操作,详细解析了各种参数和选项的使用,如忽视空格、指定开始结束位置等,并讲解了字符串比较和定位的方法。

ABAP-08 字符串处理 - 重点

1、字符串的基本操作

1.1 连接字符串

CONCATENATE {c1} … {cn} INTO {c} [SEPARATED BY {s}]

CONCATENATE只能拼接字符型字段

*字符串连接。
DATA i_str1(10) TYPE c.
DATA i_str2(20) TYPE c.
DATA o_RS TYPE string.

i_str1 = 'LION'.
i_str2 = 'HELLO'.

CONCATENATE I_STR1 I_STR2 INTO O_RS.
WRITE: O_RS,/." 输出:LIONHELLO.
CONCATENATE I_STR1 I_STR2 INTO O_RS SEPARATED BY '/'.
WRITE: O_RS,/." 输出:LION/HELLO.
ULINE.

以下会报错

*字符串连接。
DATA i_str1(10) TYPE c.
DATA i_str2(20) TYPE c.
DATA i_str3 TYPE i.
DATA o_rs TYPE string.

i_str1 = 'LION'.
i_str2 = 'HELLO'.
i_str3 = 100.

CONCATENATE i_str1 i_str2 i_str3 INTO o_rs." 此处会报错,提示i_str3必须要是字符型

1.2 拆分字符串

SPLIT {c} AT {del} INTO {c1} … {cn}.

DATA a(10) TYPE c VALUE 'hello'.
DATA b(20) TYPE c VALUE 'word'.

DATA:c(10) TYPE c,
      d(20) TYPE c,
      all TYPE string.

CONCATENATE a b INTO all SEPARATED BY '/'.
WRITE: all."输出:hello/word。
SPLIT all AT '/' INTO c d.
WRITE: / c."输出:hello
WRITE / d."输出:word

注:1、当拆分时,into后面的字段不够时,最后一个字段放剩余的所有内容

DATA a(10) TYPE c VALUE 'hello'.
DATA b(20) TYPE c VALUE 'word'.

DATA:c(10) TYPE c,
      d(20) TYPE c,
      e(20) type c,
      all TYPE string.

CONCATENATE a b '!' INTO all SEPARATED BY ' '.
WRITE: all."输出:hello word。

*拆分后字段不足的
SPLIT all AT ' ' INTO c d.
WRITE: / c."输出:hello
WRITE / d."输出:word !

*拆分后字段足够的
SPLIT all AT ' ' INTO c d e.
WRITE: / c."输出:hello .
WRITE / d."输出:word .
WRITE / e."输出:! .

注:不知道能拆分多少个时,把拆分后的先放表格table中,然后再取出

DATA a(10) TYPE c VALUE 'hello'.
DATA b(20) TYPE c VALUE 'word'.

DATA:c(10) TYPE c,
      d(20) TYPE c,
      e(20) type c,
      all TYPE string.

CONCATENATE a b '!' INTO all SEPARATED BY ' '.
WRITE: all."输出:hello word !。

data I_it TYPE STANDARD TABLE OF string.
SPLIT all AT ' ' INTO TABLE I_it.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cZ2ipqWc-1646881904905)(ABAP-08 字符串处理 - 重点.assets/image-20220307104943890.png)]

1.3 查找字符串

SEARCH {str} FOR {a1} {options}:在str中查找a1

SY-SUBRC=0表示找到了,SY-FDPOS为a1在str的下标位置

1.31 参数(a1)

后面空格忽略,前面的空格还是作数的

*参数(a1):后面空格忽略,前面的空格还是作数的。
* 能找到。
DATA str TYPE string VALUE 'Hello World!'.
SEARCH str FOR 'h         '. " 找到,位置=0。
SEARCH str FOR ' h '." 找不到,因为h前面带空格,前面空格不忽略。
1.32 参数(.a1.)

逗号中间的内容是作数的,包括空格

逗号外面带空格也是作数的,单引号和逗号之间尽量不要带空格

*参数(.a1.):两个..之间的空格算数,(.a1.)前面空格算数,后面空格还是作数的。
DATA str TYPE string VALUE 'Hello World!'.
SEARCH str FOR '.l.'." 找到,位置=2
SEARCH str FOR '. l.'." 找不到,两个..之间有空格也是有效的
SEARCH str FOR '.l. '." 找到,位置=2,参数(.1.)后面有空格忽略不算的
SEARCH str FOR ' .l.'." 找不到,参数(.1.)前面有空格也作数
1.33 参数(*a1)

查找以a1结尾的字符串

1.34 参数(a1*)

查找以a1开头的字符串

1.35 {options}的指定

SEARCH {str} FOR {a1} STARTING AT {n1}指定开始位置 ENDING AT {n2}指定结束位置

n1、n2 指的是a1字符串的第几个字符,不是a1的下标

DATA str TYPE string VALUE 'Hello World!'.
SEARCH str FOR '.l.' STARTING AT 1 ENDING AT 2." 找不到,因为STARTING AT 1 ENDING AT 2截取到的是He

1.4 替换字符串

REPLACE {a1} WITH {b2} INTO {str} [LENGTH {l}]:在str中查找a1,如果有则替换为b2

LENGTH {l} 是指 把a1截取该长度后再去查找替换

DATA a(10) TYPE c VALUE 'hello'.
DATA b(20) TYPE c VALUE 'word'.

DATA:c(10) TYPE c,
      d(20) TYPE c,
      e(20) type c,
      all TYPE string.

CONCATENATE a b '!' INTO all SEPARATED BY ' '.
WRITE: / all."输出:hello word !。

REPLACE 'h' WITH '好' INTO all.
WRITE: / all."输出:好ello word !。

注:以上是只查找替换一个,如有多个–待定

--待定

1.5 字符串长度

STRLEN( str ):括号和str两边必须空格隔开,不然语法会报错

DATA str TYPE string VALUE 'Hello World!'.
DATA lens1 TYPE i.
lens1 = STRLEN( str ).
WRITE: lens1." 输出:12.

DATA lens2 type i.
str = '大家一起来!'.
lens2 = strlen( str ).
WRITE:/ lens2."输出:6. 中文长度也是1个

1.6 字符串其他操作

操作说明
SHIFT根据第一个或最后一个字符移动字段串
CONDENSE去除多余空格
TRANSLATE大小写转换
CONVERT TEXT转换排序格式
OVERLAY字符串覆盖替换
1.61 移动字符串
DATA str6(7) type c VALUE 'Hello'.
WRITE str6."输出:Hello.
SHIFT str6 by 1 PLACES.
WRITE / str6."输出:ello.

SHIFT str6 by 5 PLACES RIGHT.
WRITE / str6."输出:     el,el前面有5个空格的.
1.62 去除多余空格

注:字符串后面空格系统会自动去除

DATA str62(20) TYPE c VALUE '  He  llo   '."前面2空格,中间2空格,后面1空格。
DATA str621(10) TYPE c VALUE 'WORLD'.
WRITE str62."输出:(  He  llo),后面空格系统会默认去除
CONDENSE str62.
WRITE / str62."输出:(He  llo),前面的2空格都没了
CONCATENATE str62 str621 INTO str62 SEPARATED BY '-'.
WRITE / str62."输出:(He llo-WORLD).
1.63 大小写转换

TRANSLATE str TO UPPER CASE 转大写

TRANSLATE str TO LOWER CASE 转小写

DATA str63(10) TYPE c VALUE 'Hello 中国'.
WRITE:/ str63."输出:Hello 中国.
TRANSLATE str63 TO UPPER CASE.
WRITE:/ str63."输出:HELLO 中国.
TRANSLATE str63 TO LOWER CASE.
WRITE:/ str63."输出:hello 中国.
1.64 转换排序格式 - 空,少用
1.65 覆盖替换

OVERLAY 原str WITH 替換str ONLY ‘l’.

a、注意和replace的区别

b、ONLY参数:区分大小写,无ONLY时默认替换空格

DATA:i_str61 TYPE string,
      i_str62 TYPE string.

i_str61 = 'He llo Tim'.
i_str62 = 'xy999999'.

OVERLAY i_str61 WITH i_str62 ONLY 't'.
WRITE / i_str61."输出:i_str61原值-He llo Tim,区分大小写的。
OVERLAY i_str61 WITH i_str62 ONLY 'T'.
WRITE / i_str61."输出:He llo 9im。
i_str61 = 'He llo Tim'.
OVERLAY i_str61 WITH i_str62.
WRITE / i_str61."输出:He9llo9Tim。没有ONLY参数的,默认替换空格。

2、字符串比较和定位

2.1 字符串比较

a、区分大小写

b、一般要确保左边的变量是string类型

操作符说明
CO操作字符串1中每个字符都在操作字符串2中存在,则表达式为true,反之为false.表达式为true时sy-fdpos = 操作字符串1的长度 ,为false时,sy-fdpos = 操作字符串1中不在操作字符串2中的字符所在作字符串1中第一个位置。
CN操作字符串1中不是每个字符都在操作字符串2中存在,则表达式为true,反之为false.表达式为false时sy-fdpos = 操作字符串1的长度 ,为true时,sy-fdpos = 操作字符串1中不在操作字符串2中的字符所在作字符串1中第一个位置。
CA操作字符串1中任意字符在操作字符串2中存在,则表达式为true,sy-fdpos = 第一个出现在操作字符串2中的字符所在操作字符串1中的第一个位置。反之为false ,sy-fdpos = 操作字符串1长度。
NA操作字符串1中任意字符在操作字符串2中不存在,则表达式为true,sy-fdpos = 操作字符串1长度。反之为false ,sy-fdpos = 第一个出现在操作字符串2中的字符所在操作字符串1中的第一个位置。
CS操作字符串1包含字符串2,则表达式为true,sy-fdpos = 第一个出现在操作字符串2中的字符串的第一个字符所在操作字符串1中的第一个位置。反之为false ,sy-fdpos = 操作字符串1长度。如果操作字符串1为空操作字符串2不空则表达式为false,sy-fdpos = 0.
NS操作字符串1不包含字符串2中不存在,则表达式为true,sy-fdpos = 操作字符串1长度。反之为false ,sy-fdpos = 第一个出现在操作字符串2中的字符串的第一个字符所在操作字符串1中的第一个位置。
CP如果字符串1包含模式字符串2,则逻辑表达式为真,操作字符串2中输入通配符 “*”代表任意字符串,“+”任意字符。如果匹配则表达式为true,sy-fdpos = 操作字符串1中与操作字符串2中除操作通配符外的第一个字符位置。
NP如果字符串1不包含模式字符串2,则逻辑表达式为真,操作字符串2中输入通配符 “*”代表任意字符串,“+”任意字符。如果匹配则表达式为true,sy-fdpos =操作字符串1的长度。反之为false ,sy-fdpos = 操作字符串1中与
2.11 CO

stra都在后面strb中

DATA:stra TYPE string,
      strb TYPE string.

*输出:真     2,sy-fdpos=第一个字符串的长度
stra = 'ad'.
strb = 'abcde'.
IF stra CO strb.
  WRITE:'真',sy-fdpos.
ELSE.
  WRITE:'假',sy-fdpos.
ENDIF.
*输出:假     0,区分大小写的,假时sy-fdpos=stra不在strb中的第一个字符在stra本身的位置,即A在stra的位置
stra = 'Ad'.
strb = 'abcde'.
IF stra CO strb.
  WRITE:'真',sy-fdpos.
ELSE.
  WRITE:'假',sy-fdpos.
ENDIF.
2.12 CA

stra任意一个在后面strb中

*输出:真 1,真时sy-fdpos=存在于strb中的a在stra的位置
stra = 'zayy'.
strb = 'abcde'.
IF stra CA strb.
  WRITE:'真',sy-fdpos.
ELSE.
  WRITE:'假',sy-fdpos.
ENDIF.
*输出:假 4,假时sy-fdpos=stra的长度。
stra = 'zAyy'.
strb = 'abcde'.
IF stra CA strb.
  WRITE:'真',sy-fdpos.
ELSE.
  WRITE:'假',sy-fdpos.
ENDIF.
2.13 CS

stra全包含后面的字符串strb

*输出:真 1,真时sy-fdpos=存在于strb中的xyu的第一个字符x在stra的位置
stra = 'axyu'.
strb = 'xyu'.
IF stra CS strb.
  WRITE:'真',sy-fdpos.
ELSE.
  WRITE:'假',sy-fdpos.
ENDIF.
*输出:假 4,没有xu只有xyu,假时sy-fdpos=stra的长度。
stra = 'axyu'.
strb = 'xu'.
IF stra CS strb.
  WRITE:'真',sy-fdpos.
ELSE.
  WRITE:'假',sy-fdpos.
ENDIF.
2.14 CP

stra全包含后面的模式字符串strb

*输出:假 3,假时sy-fdpos=stra的长度
stra = 'ady'.
strb = 'ad'.
IF stra CP strb.
  WRITE:'真',sy-fdpos,/.
ELSE.
  WRITE:'假',sy-fdpos,/.
ENDIF.
*输出:真 0,真时sy-fdpos=相同字符串的第一个字符在stra的位置。
stra = 'dya'.
strb = 'dy+'.
IF stra CP strb.
  WRITE:'真',sy-fdpos,/.
ELSE.
  WRITE:'假',sy-fdpos,/.
ENDIF.

*输出:真 3,真时sy-fdpos=相同字符串的第一个字符在stra的位置。
stra = 'aaadya'.
strb = '*dy*'.
IF stra CP strb.
  WRITE:'真',sy-fdpos,/.
ELSE.
  WRITE:'假',sy-fdpos,/.
ENDIF.

2.2 字符串定位

实际上是根据定位后截取字符串的某个部分

str + length(length)

DATA strD TYPE d.
strD = '20210310'.
WRITE strD+0(4)."输出:2021,从下标0开始截取4位
WRITE strD+4(2)."输出:03,从下标4开始截取2位
WRITE strD+5(2)."输出:31,从下标5开始截取2位
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值