字符串处理与正则表达式 (★★★)
#string-processing #data-types
Unicode vs 非 Unicode
| 方面 |
Unicode 系统 |
非 Unicode 系统 |
| 字符编码 |
ISO/IEC 10646 (UTF-16) |
依赖代码页 |
| 每字符字节数 |
2(ABAP 中固定) |
1(依赖代码页) |
| 字符集 |
所有 Unicode 字符 |
限于代码页 |
| 现代 SAP 默认 |
是 |
仅遗留系统 |
按类型的数据对象类别
| 类别 |
类型 |
描述 |
| 字节型 |
x, xstring |
原始字节;无字符语义 |
| 字符型 |
c, n, d, t, string |
字符语义;受代码页影响 |
| 数值型 |
i, f, p, decfloat16, decfloat34 |
可隐式转换为字符型 |
字符串语句
| 语句 |
用途 |
关键附加项 |
FIND |
搜索子串/正则 |
REGEX、FIRST OCCURRENCE、ALL OCCURRENCES |
REPLACE |
替换子串/正则 |
REGEX、SECTION OFFSET、OF |
CONCATENATE |
连接字符串 |
SEPARATED BY、RESPECTING BLANKS |
SPLIT |
分割字符串到表 |
AT |
TRANSLATE |
转换大小写/替换字符 |
TO UPPER/LOWER、USING |
CONDENSE |
删除多余空格 |
NO-GAPS |
SHIFT |
移动字符串内容 |
LEFT、RIGHT、CIRCULAR、BY 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 ) |
布尔值 |
完全匹配检查 |
字符串表达式和模板
字符串模板
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 = |
LEFT、RIGHT、CENTER |
宽度内对齐 |
PAD = |
字符 |
填充字符(默认:空格) |
CASE = |
RAW、UPPER、LOWER |
大小写转换 |
SIGN = |
LEFT、LEFTPLUS、LEFTSPACE、RIGHT、RIGHTPLUS、RIGHTSPACE |
符号显示 |
DECIMALS = n |
整数 |
小数位数 |
DATE = |
RAW、ISO、USER、ENVIRONMENT |
日期格式 |
TIME = |
RAW、ISO、USER、ENVIRONMENT |
时间格式 |
CURRENCY = |
货币代码 |
依赖货币的格式化 |
COUNTRY = |
国家代码 |
依赖国家的格式化 |
ALPHA = |
IN、OUT |
转换出口 ALPHA |
NUMBER = |
RAW、USER、ENVIRONMENT |
数字格式 |
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 匹配 abc、aXc |
\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
|
考试/测试模式
| 关键词/模式 |
答案 |
| “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 格式化” |
模板中依赖货币的小数位数 |
相关笔记
- 算术表达式
- 内表类型
- 特殊表技术
- 数据引用与字段符号
- [[_posts/SAP_MM/SCM500_采购流程/00-仪表盘/考试陷阱]]
- [[_posts/SAP_MM/SCM500_采购流程/00-仪表盘/快速参考]] - 字符串函数部分