字符串的处理在程序中的使用十分常见,在这里结合自己日常的使用对ABAP的字符串常用操作进行总结,以便后续使用。
1.获取字符串长度
var1 = strlen( str );将 str 作为字符数据处理,计算出其字符长度。
DATA:l_len type i,
str1(20) VALUE '1234'.
l_len = strlen(str1).
WRITE: len.
2.拼接字符串
将多个字符串拼接到指定的变量 Var 中,注意 Var 的长度。C、D、N、T数据类型的前导空格会保留,尾部空格会去掉,对 String 类型的所有空格都会保留。
CONCATENATE <str1> ... <strn> into <var> [SEPARATED BY <s>][RESPECTING BLANKS].
[SEPARATED BY <s>]:根据指定间隔符号 S 进行拼接,SPACE[RESPECTING xx]:针对C、D、N、T 数据,表示尾部空格会保留
3.压缩字符串
去除字段中的前后空格,并将字段中多个空格使用一个空格替换。
CONDENCE <str> [NO-GAPS].
- NO-GAPS:去除字段中的所有空格
4.截取字符串
- subtext = str+0(4):从最左边取出4个字符
- subtext = str+2(4):从第2个字符开始取出4个字符
- str+2(1) = ‘X’:变更字符串指定位置的值
5.查找字符串
在字符串中搜索子字符串,成功则 SY-SUBRC = 0。
SEARCH <var> FOR <str> <options>.
- str:可以使用正则表达式,也可以使用普通字符串
6.替换字符串
REPLACE <str1> WITH <str2> INTO <var> [LENGTH <l>].- 将str1在var中的字段替换为str2
- 如果指定长度,则只将str1中指定长度的字符替换为str2中的内容
- 如果替换后内容总长度超过var定义的长度,会出现截断现象
7.SHIFT 截断字符串
将字符串移动 n 个位置。去除字符串后面 0 时,可能会出现有空格的情况,需要压缩空格。
SHIFT <var> [BY <n> PLACES] [<mode>].
-
[BY n PLACES]:按照给定位置数移动字符串,n为0或负数时字符串保存不变
-
MODE:指定字符串截断的方向,LEFT(默认)、RIGHT、CIRCULAR(把左边的字符放到右边)
-
SHIFT <var> LEFT DELETING LEADING <str>. -
SHIFT <var> RIGHT DELETING TRAILING <str>. -
如果左边第一个字符串或则右边第一个字符串出现在 str 中,将字段移动相应的位置
8.拆分字符串
将字符串的值分配给具体变量:SPLIT dobj AT sep INTO res1 res2 ... resn.
DATA: str1 TYPE string,
str2 TYPE string,
str3 TYPE string,
itab TYPE TABLE OF string,
text TYPE string.
text = `What a drag it is getting old`.
SPLIT text AT space INTO: str1 str2 str3,TABLE itab.
将字符串的值分配给一内表SPLIT s_source AT sep INTO TABLE itab.
DATA : lv_string TYPE string .
TYPES: BEGIN OF ty_string,
str(25) TYPE c,
END OF ty_string.
DATA lt_string TYPE TABLE OF ty_string.
DATA wa_string TYPE ty_string.
lv_string = 'SPLIT ME AT SPACE'.
SPLIT lv_string AT ' ' INTO TABLE lt_string .
LOOP AT lt_string INTO wa_string.
WRITE :/ wa_string-str.
ENDLOOP.
9.比较字符串
判断是否包含特定值
- IF field CN ‘0123456789’.
- IF field CO ‘ABCDEFG*’
- IF field CN ‘abcdefg*’
- IF field CN ‘/’ …..
| 表达式 | 描述 | 表达式 | 描述 |
|---|---|---|---|
| CO | Contains Only(仅包含,A是否仅由B中字符组成) | CN | Contains Not Only (不仅包含) |
| CS | Contains String (包含字符串,A是否包含字符串B) | NS | Contains No String (不包含字符串) |
| CP | Covers Pattern (包含模式,A是否包含B中的模式) | NP | No Pattern(不包含记号) |
| CA | Contains Any(包含任何,A是否至少包含一个B) | NA | Contains Not Only(不包含任何) |
10.大小写转换
TRANSLATE c TO [UPPER] [LOWER] CASE.:将字符串转换为大|小写
11.字符前拼接空格
在 Grid ALV 上也显示空格:
IF <fw_output>-name2+0(1) eq space AND <fw_output>-name2 IS NOT INITIAL.
h_white = cl_abap_conv_in_ce=>uccpi( 160 ).
REPLACE ALL OCCURRENCES OF REGEX '\s' IN <fw_output>-name2 WITH h_white.
ENDIF.
12.判断字符是否为纯数字
IF cl_abap_matcher=>matches(
pattern = '^(-?[1-9]\d*(\.\d*[1-9])?)|(-?0\.\d*[1-9])$'
text = '文本' ) = abap_true.
"文本包含全为数字"
ENDIF.