ABAP 字符串处理
在 ABAP 编程中广泛使用的字符串是字符序列。
我们使用数据类型 C 变量来保存字母数字字符,最少 1 个字符,最多 65,535 个字符。默认情况下,它们左对齐。
定义字符串:
DATA hello(20) VALUE 'Hello, World!'.
ABAP 提供了大量用于处理字符串的选项。选项包括 ABAP 语句(例如 FIND)、字符串表达式(连接和字符串模板)和内置字符串函数(例如 strlen)。
ABAP 为包含字符串的数据对象提供了以下内置数据类型。它们的区别如下:
| Type | Details | Length | Value Range | Initial Value |
|---|---|---|---|---|
string | For variable length character strings. Data objects of this type are dynamic data objects, i. e. the length of a variable can change during the execution of an ABAP program and thus it can contain character strings of different lengths. A data object of type string is called text string or, in short, just string. | No standard length; length is variable | Any Unicode characters that can be encoded in ABAP language's code page UCS-2. The most common content are alphanumeric characters or special characters. | Empty string with length 0 |
c | For fixed length character strings. Data objects of this type are static data objects, i. e. the length of a variable must be defined during its declaration and does not change during the execution of an ABAP program. Thus, it always contains character strings of the same length. A data object of type c is called text field. | Data objects of this type can contain a string of fixed length (between 1 and 262143 characters); standard length: 1 | Same as for string | A blank for each position |
通过在模板的开头和结尾使用 |(管道)符号来定义字符串模板:
DATA: character_string TYPE string.
character_string = |This is a literal text.|.
WRITE: /(30) character_string.
当将文字文本与嵌入的表达式和控制字符组合在一起时,字符串模板的附加功能就变得很明显了。嵌入式表达式在带有大括号 { expression } 的字符串模板中定义。请注意,括号和表达式之间的空格是必须的。一些例子是:
character_string = |{ a_numeric_variable }|.
character_string = |This resulted in return code { sy-subrc }|.
最重要的是,你可以把这样的结构(开始 | 和结束 | 之间的文本)传递到期待字符串的方法调用的参数中。以前,我们必须在一个局部变量中创建字符串,然后在方法调用中使用该局部变量。
LO_OBJECT->STRING2XML( |{ converted_xml }{ xml_row-row_close_tag }| ).
获取字符串长度 STRLEN
var1 = strlen(str); 将 str 作为字符数据处理,计算出其字符长度
DATA: len TYPE i.
DATA hello(20) VALUE 'Hello, World!'.
len = strlen( hello ).
WRITE:/ 'The length of "Hello" is:', len.
拼接字符串 CONCATENATE 和 && 符号
将多个字符串拼接到指定的变量 Var 中,注意 Var 的长度
CONCATENATE <str1> ... <strn> into <var> [SEPARATED BY <s>][RESPECTING BLANKS]
- C,D,N,T 类型的前导空格会保留,尾部空格会去掉,对 String 类型的所有空格都会保留
[SEPARATED BY <s>]: 根据该间隔符号 (S) 进行拼接 (SPACE)- respecting:针对 C,D,N,T 数据,表示尾部空格会保留
还可以通过 && 将四个操作数串联为字符串 "Hello world!"。最后一个操作数是一个只有字面内容的字符串模板:
DATA text TYPE string VALUE `Hello`.
text = text && ` ` && 'world' && |!|.
压缩字符串 CONDENSE
CONDENCE <str> [NO-GAPS]:
- 去除字段
str中的前后空格,并将字段中多个空格使用一个空格替换; - 如果加上 NO-GAPS 则去除所有空格。
截取字符串
subtext = str+0(18):从最左边取出 18 个字符
subtext = str+18(2):从第 18 个字符开始取出 2 个字符
str+0(1) = 'X':变更指定位置的值
查找字符串 SEARCH
SEARCH <var> FOR <str> <options>.:
- 在
var中搜索子字符串,成功SY-SUBRC=0 - str: 可以使用正则表达式,也可以使用普通字符串
替换字符串 REPLACE
REPLACE <str1> WITH <str2> INTO <var> [LENGTH <l>]. :
- 将
str1在var中的字段替换为str2 - 如果指定长度,则只将 str1 中指定长度的字符替换为
str2中的内容 - 如果替换后内容总长度超过
var定义的长度,会出现截断现象
移动字符串内容 SHIFT
SHIFT <var> [BY <n> PLACES] [<mode>].
将 var 移动 n 个位置,
MODE:LEFT(默认),RIGHT,CIRCULAR
SHIFT <var> LEFT DELETING LEADING <str>.
SHIFT <var> RIGHT DELETING TRAILING <str>.
如果左边第一个字符串或则右边第一个字符串出现在 str 中,将 var 移动相应的位置
比较字符串
判断是否包含特定值
IF field CN ‘0123456789’.
IF field CN ‘ABCDEFG*’
IF field CN ‘abcdefg*’
IF field CN ‘/’ …..
| CN:Contains Not Only (包含,不仅包含) | CO:Contains Only(仅包含) |
| CS:Contains String (包含字符串) | NS:Contains No String (不包含字符串) |
| NP:No Pattern (不包含记号) | NA:Contains Not Only(不包含任何) |
| CA:Contains Any(包含任何) | CP:Covers Pattern (包含记号) |
拆分字符串 SPLIT
SPLIT dobj AT sep INTO {res1 res2……resn}. :将字符串的值分配给具体变量
SPLIT s_source AT sep INTO TABLE itab:将字符串的值分配给一内表。
大小写转换
字符串函数 to_lower 和 to_upper 将字符串的字符转换为小写或大写并将结果存储在目标变量中。
如果您想直接将转换直接应用到源,您可以使用 TRANSLATE 语句。
将字符串转换为大|小写:
to_upper( [ *[* val = *]* text]() ) ...
to_lower( [ *[* val = *]* text]() ) ...
TRANSLATE c TO UPPER|LOWER CASE.
s = to_upper( s ). " to_upper 将字符串中的所有字母转换为大写字母。
l = to_lower( l ). " 将字符串中的所有字母转换为小写字母
"String functions
DATA(s1) = to_upper( `abap` ). "ABAP
s1 = to_lower( `SOME_FILE.Txt` ). "some_file.txt
"TRANSLATE statements
s1 = `Hallo`.
TRANSLATE s1 TO UPPER CASE. "HALLO
TRANSLATE s1 TO LOWER CASE. "hallo
to_mixed( [ val = ] text [ sep = sep ] [ case = case ] [ min = min ] ) ...
-
to_mixed函数将字符串中的所有字母从第二个位置开始转换为小写字母。然后从字符串中删除 sep 中指定的第一个字符(从第二个位置从左到右)并将下一个字母转换为大写字母。分隔符 sep 的默认值是下划线 ( _ )。如果未指定大小写,则字符串的第一个字符保持不变。如果指定了 case 并且 case 的第一个字符是大写字母,则字符串中的第一个字符也是大写的,然后在所有其他出现的地方都是小写的。一个正数可以传递给 min 指定在分隔符生效之前必须出现在分隔符之前的最少字符数(从字符串的开头或自上次替换以来)。min 的默认值为 1 。 -
from_mixed在每个大写字母前插入 sep 中指定的第一个字符(从左到右,从第二个位置开始)。分隔符 sep 的默认值是下划线 ( _ )。如果不指定大小写或者如果第一个字符是大写字母,则整个字符串显示为大写;否则显示为小写。可以将正数传递给 min 以指定必须出现在大写字母之前的最小字符数(从字符串的开头或自上次插入以来),以便插入分隔符。min 的默认值为 1 。
函数
to_mixed和from_mixed用于将带有下划线的名称的标准 ABAP 命名约定转换为带有大写和小写字母的标准 Java 命名约定(即混合大小写样式和驼峰大小写样式),反之亦然。
字符前拼接空格
在 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.
参考链接:String Processing