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

3196

被折叠的 条评论
为什么被折叠?



