ABAP 字符串处理

737 阅读6分钟

ABAP 字符串处理

在 ABAP 编程中广泛使用的字符串是字符序列。

我们使用数据类型 C 变量来保存字母数字字符,最少 1 个字符,最多 65,535 个字符。默认情况下,它们左对齐。

定义字符串:

DATA hello(20) VALUE 'Hello, World!'.

ABAP 提供了大量用于处理字符串的选项。选项包括 ABAP 语句(例如 FIND)、字符串表达式(连接和字符串模板)和内置字符串函数(例如 strlen)。

ABAP 为包含字符串的数据对象提供了以下内置数据类型。它们的区别如下:

TypeDetailsLengthValue RangeInitial Value
stringFor 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 variableAny 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
cFor 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: 1Same as for stringA 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.

image.png

拼接字符串 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>]. :

  • str1var 中的字段替换为 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_lowerto_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_mixedfrom_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