字符串处理与正则表达式

字符串处理与正则表达式 (★★★)

#string-processing #data-types

Unicode vs 非 Unicode

方面 Unicode 系统 非 Unicode 系统
字符编码 ISO/IEC 10646 (UTF-16) 依赖代码页
每字符字节数 2(ABAP 中固定) 1(依赖代码页)
字符集 所有 Unicode 字符 限于代码页
现代 SAP 默认 仅遗留系统
📌所有现代 SAP 系统都是 Unicode 系统。字符串处理必须考虑每个字符 2 字节。

按类型的数据对象类别

类别 类型 描述
字节型 x, xstring 原始字节;无字符语义
字符型 c, n, d, t, string 字符语义;受代码页影响
数值型 i, f, p, decfloat16, decfloat34 可隐式转换为字符型
💡日期(d)和时间(t)是字符型字段。它们支持特殊算术,但以字符串形式存储和处理。

字符串语句

语句 用途 关键附加项
FIND 搜索子串/正则 REGEXFIRST OCCURRENCEALL OCCURRENCES
REPLACE 替换子串/正则 REGEXSECTION OFFSETOF
CONCATENATE 连接字符串 SEPARATED BYRESPECTING BLANKS
SPLIT 分割字符串到表 AT
TRANSLATE 转换大小写/替换字符 TO UPPER/LOWERUSING
CONDENSE 删除多余空格 NO-GAPS
SHIFT 移动字符串内容 LEFTRIGHTCIRCULARBY n PLACES
STRLEN 获取长度 返回整数

IN BYTE MODE / IN CHARACTER MODE

  • IN CHARACTER MODE:默认;按字符处理
  • IN BYTE MODE:按字节处理;字节型(x/xstring)操作必需
1
2
FIND lv_byte IN BYTE MODE.
SHIFT lv_string BY 2 PLACES IN CHARACTER MODE.

字符串函数

描述性函数

函数 返回值 说明
strlen( arg ) 字符串长度 字符长度
xstrlen( arg ) xstring 长度 字节长度
numofchar( arg ) 字符数 忽略尾部空格
find( val, sub ) 子串偏移量 未找到返回 -1
find( val, regex ) 正则匹配偏移量 默认区分大小写
count( val, sub ) 计数出现次数 子串或正则
contains( val, sub ) 布尔值 找到子串则为真
matches( val, regex ) 布尔值 正则匹配则为真

处理函数

函数 返回值 说明
substring( val, off, len ) 子串 偏移量和长度
to_upper( val ) 大写
to_lower( val ) 小写
reverse( val ) 反转字符串
repeat( val, n ) 重复字符串
shift_left( val, n ) 左移
shift_right( val, n ) 右移
concat_lines_of( itab, sep ) 连接字符串 从内表

谓词函数

函数 返回值 用法
contains( val, sub ) 布尔值 IF contains( lv_text, abc ).
contains( val, regex ) 布尔值 正则变体
matches( val, regex ) 布尔值 完全匹配检查
💡字符串函数可以链式调用:to_upper( substring( val = lv_text off = 0 len = 5 ) )

字符串表达式和模板

字符串模板

1
DATA(lv_result) = |Hello { lv_name }, today is { sy-datum DATE = USER }|.

语法:|literal {expression option} literal|

  • 嵌入表达式用 { } 包围
  • { } 外为字面文本
  • 反斜杠 \ 用于转义:\{\}\\

字符串连接运算符

1
DATA(lv_full) = lv_first && ` ` && lv_last.
  • && 连接类字符串操作数
  • 两个操作数都转换为 string

嵌入表达式的格式化选项

选项 效果
WIDTH = n 整数 最小输出宽度
ALIGN = LEFTRIGHTCENTER 宽度内对齐
PAD = 字符 填充字符(默认:空格)
CASE = RAWUPPERLOWER 大小写转换
SIGN = LEFTLEFTPLUSLEFTSPACERIGHTRIGHTPLUSRIGHTSPACE 符号显示
DECIMALS = n 整数 小数位数
DATE = RAWISOUSERENVIRONMENT 日期格式
TIME = RAWISOUSERENVIRONMENT 时间格式
CURRENCY = 货币代码 依赖货币的格式化
COUNTRY = 国家代码 依赖国家的格式化
ALPHA = INOUT 转换出口 ALPHA
NUMBER = RAWUSERENVIRONMENT 数字格式
1
2
3
4
5
" 示例
|Value: { lv_num ALIGN = RIGHT WIDTH = 10 PAD = '0' }|
|Date: { sy-datum DATE = ISO }| " 2026-05-10
|Name: { lv_name CASE = UPPER }|
|Amount: { lv_price DECIMALS = 2 CURRENCY = 'EUR' }|

正则表达式

单字符模式

模式 匹配 示例
. 任意单个字符 a.c 匹配 abcaXc
\d 任意数字(0-9) \d\d 匹配 42
\w 任意单词字符(字母数字 + _ \w+ 匹配 hello_1
\s 任意空白字符
[A-Z] 字符类:A 到 Z
[0-9] 字符类:数字
[abc] 字符类:a、b 或 c
[^abc] 否定类:非 a、b、c

字符串模式(量词和分组)

模式 含义 贪婪?
{n} 恰好 n 次 -
{n,m} n 到 m 次 是(贪婪)
{n,m}? n 到 m 次 否(懒惰)
? 零次或一次
* 零次或多次
+ 一次或多次
` ` 选择(或)
( ) 捕获组
(?: ) 非捕获组
\1, \2 反向引用

最左最长规则

  • 正则引擎在字符串中找到最左的匹配
  • 在同一位置的多个匹配中,选择最长的(贪婪)
  • 懒惰量词(?*?+?)优先选择最短匹配
1
2
3
4
" 模式:a.*b  匹配 "aXbYb"
" 贪婪匹配:aXbYb (从最左 'a' 开始的最长匹配)
" 模式:a.*?b 匹配 "aXbYb"
" 懒惰匹配:aXb (从最左 'a' 开始的最短匹配)

在 ABAP 语句中使用正则

1
2
3
4
5
6
7
8
9
10
11
12
13
" FIND 使用正则
FIND REGEX '\d{4}-\d{2}-\d{2}' IN lv_text.
FIND ALL OCCURRENCES OF REGEX '[A-Z]+' IN lv_text RESULTS lt_results.

" REPLACE 使用正则
REPLACE ALL OCCURRENCES OF REGEX '\s+' IN lv_text WITH ` `.

" 字符串函数使用正则
IF matches( val = lv_email regex = '[\w.]+@[\w]+\.[\w]+' ).
" 有效的邮箱模式
ENDIF.

DATA(lv_count) = count( val = lv_text regex = '\d' ).

日期和时间作为字符串

类型 长度 格式 算术
d(日期) 8 字符 YYYYMMDD 支持 + n / - n(天),减法 = 相隔天数
t(时间) 6 字符 HHMMSS 支持 + n / - n(秒)
1
2
3
4
5
DATA: lv_date TYPE d VALUE '20260510',
lv_tomorrow TYPE d.

lv_tomorrow = lv_date + 1. " 20260511
DATA(lv_days) = lv_tomorrow - lv_date. " 1
💡日期和时间字段以字符串形式存储但支持隐式算术。这是 ABAP 的特殊功能,不是通用的字符串算术。

考试/测试模式

关键词/模式 答案
“Unicode 每字符字节数” Unicode 系统中每字符 2 字节
“字节型 vs 字符型” x/xstring = 字节;c/n/d/t/string = 字符
| \{ \} 模板” 带嵌入表达式的字符串模板
&& 运算符” 表达式中的字符串连接
“IN BYTE MODE” x/xstring 类型操作必需
find() vs contains() find 返回偏移量;contains 返回布尔值
matches() 函数” 完全正则匹配;返回布尔值
“最左最长” 正则匹配规则:找最左,然后最长
(?: ) 非捕获组” 不创建反向引用的分组
“DATE = ISO” 在字符串模板中将日期格式化为 YYYY-MM-DD
CONDENSE NO-GAPS 删除字符串中所有空格
“字符串模板转义” 使用 \{\} 表示字面大括号
“CURRENCY 格式化” 模板中依赖货币的小数位数

相关笔记