目录
1.ABAP 中的正则表达式语法
ABAP 中的正则表达式语法基于 POSIX 标准,提供了强大的文本模式匹配功能。以下是 ABAP 正则表达式的完整语法指南。
基础语法元素
1. 1字符匹配
表达式 | 描述 | 示例 |
---|---|---|
. | 匹配任意单个字符 | a.c 匹配 "abc"、"a c" |
[...] | 字符集,匹配其中任意一个字符 | [aeiou] 匹配任何元音字母 |
[^...] | 否定字符集,不匹配其中的字符 | [^0-9] 匹配非数字字符 |
\ | 转义特殊字符 | \. 匹配实际的点号 |
1.2 预定义字符类
表达式 | 等价形式 | 描述 |
---|---|---|
\d | [0-9] | 数字字符 |
\D | [^0-9] | 非数字字符 |
\s | [ \t\r\n\f] | 空白字符 |
\S | [^ \t\r\n\f] | 非空白字符 |
\w | [a-zA-Z0-9_] | 单词字符 |
\W | [^a-zA-Z0-9_] | 非单词字符 |
1.3 位置锚点
表达式 | 描述 | 示例 |
---|---|---|
^ | 行/字符串开始 | ^ABAP 匹配行首的 "ABAP" |
$ | 行/字符串结束 | end$ 匹配行尾的 "end" |
\b | 单词边界 | \bABAP\b 匹配单词 "ABAP" |
\B | 非单词边界 | \BAP\B 匹配 "AP" 但不在单词边界 |
1.4量词(重复匹配)
表达式 | 描述 | 示例 |
---|---|---|
* | 0次或多次 | ab*c 匹配 "ac"、"abc"、"abbc" 等 |
+ | 1次或多次 | ab+c 匹配 "abc"、"abbc" 但不匹配 "ac" |
? | 0次或1次 | ab?c 匹配 "ac" 或 "abc" |
{n} | 恰好n次 | a{3} 匹配 "aaa" |
{n,} | 至少n次 | a{2,} 匹配 "aa"、"aaa" 等 |
{n,m} | n到m次 | a{2,4} 匹配 "aa"、"aaa" 或 "aaaa" |
1.5分组与捕获
表达式 | 描述 | 示例 |
---|---|---|
(...) | 捕获分组 | (ab)+ 匹配 "ab"、"abab" 等 |
(?:...) | 非捕获分组 | (?:ab)+ 匹配但不捕获 |
| | 或操作 | a|b 匹配 "a" 或 "b" |
\n | 反向引用分组 | (a)b\1 匹配 "aba" |
1.6特殊构造
零宽断言
表达式 | 描述 | 示例 |
---|---|---|
(?=...) | 正向先行断言 | ABAP(?= 8) 匹配后面是 " 8" 的 "ABAP" |
(?!...) | 负向先行断言 | ABAP(?! 7) 匹配后面不是 " 7" 的 "ABAP" |
(?<=...) | 正向后行断言 | (?<=ABAP )8 匹配前面是 "ABAP " 的 "8" |
(?<!...) | 负向后行断言 | (?<!ABAP )8 匹配前面不是 "ABAP " 的 "8" |
模式修饰符
在 ABAP 中通过 CL_ABAP_REGEX
参数设置:
DATA(regex) = cl_abap_regex=>create( pattern = 'pattern' ignore_case = abap_true " 不区分大小写 multi_line = abap_true " 多行模式 ).
2.基本用法
2.1创建正则表达式对象
DATA(regex) = cl_abap_regex=>create( pattern = 'your_pattern' ).
2.2创建匹配器
DATA(matcher) = cl_abap_matcher=>create( pattern = regex text = 'your_text' ).
2.3简写形式
DATA(matcher) = cl_abap_matcher=>create( pattern = 'your_pattern' text = 'your_text' ).
3. 常用方法
3.1检查是否匹配
IF matcher->match( ). " 匹配成功 ENDIF.
3.2查找所有匹配项
WHILE matcher->find_next( ). DATA(match) = matcher->get_match( ). WRITE: / match. ENDWHILE.
3.3获取匹配组
DATA(submatches) = matcher->get_submatches( ). LOOP AT submatches INTO DATA(submatch). WRITE: / submatch. ENDLOOP.
4.实用实例
4.1验证电子邮件格式
DATA(email_regex) = '^[\w\.=-]+@[\w\.-]+\.[\w]{2,3}$'. DATA(matcher) = cl_abap_matcher=>create( pattern = email_regex text = 'test@example.com' ). IF matcher->match( ). " 有效邮箱 ENDIF.
4.2提取日期
DATA(date_regex) = '(\d{4})-(\d{2})-(\d{2})'. DATA(matcher) = cl_abap_matcher=>create( pattern = date_regex text = '2023-05-15' ). IF matcher->find_next( ). DATA(year) = matcher->get_submatch( 1 ). DATA(month) = matcher->get_submatch( 2 ). DATA(day) = matcher->get_submatch( 3 ). ENDIF.
4.3分割字符串
DATA(split_regex) = '\s+'. " 按空白分割 DATA(matcher) = cl_abap_matcher=>create( pattern = split_regex text = 'ABAP Regex Example' ). DATA(tokens) = matcher->split( ).
4.4正则表达式解析
(([1-9]\d{0,10}|(0{1}))(\.\d{0,3}[1-9])?)
主要结构
正则表达式由两个主要部分组成:
-
[1-9]\d{0,10}|(0{1})
- 匹配整数部分 -
(\.\d{0,3}[1-9])?
- 可选的小数部分
详细解析
整数部分 [1-9]\d{0,10}|(0{1})
-
[1-9]
:匹配1-9之间的任意一个数字(不能是0) -
\d{0,10}
:匹配0到10个任意数字(0-9) -
|
:或者 -
(0{1})
:精确匹配一个0
这部分可以匹配:
-
1到9开头,后面跟着最多10位数字的数字(总共最多11位)
-
或者单独一个0
小数部分 (\.\d{0,3}[1-9])?
-
( )?
:整个小数部分是可选的 -
\.
:匹配小数点 -
\d{0,3}
:匹配0到3个任意数字(0-9) -
[1-9]
:最后一位小数必须是非零数字
这部分可以匹配:
-
小数点后1到4位数字,其中最后一位不能是0
-
或者不匹配任何内容(因为整个小数部分是可选的)
示例匹配
这个正则表达式可以匹配以下格式的数字:
-
整数:
0
,1
,12
,12345678901
(11位) -
小数:
0.1
,0.01
,0.001
,0.0001
,123.456
,123.4001
(最后一位小数不能是0) -
如果要匹配负数,可以在开头添加
-?
匹配任意两位数字但不能为00的正则表达式
[1-9][0-9]|0[1-9]|[1-9]0 //更简洁的写法 (?!00)\d{2} //使用负向先行断言来确保匹配的不是"00",然后匹配任意两位数字\d{2}。
5.ABAP 特有注意事项
-
大小写敏感:默认区分大小写,需设置
ignore_case
参数来忽略大小写 -
Unicode 支持:ABAP 正则表达式完全支持 Unicode 字符
-
性能考虑:复杂正则表达式可能影响性能,建议:
-
缓存频繁使用的正则表达式对象
-
优先使用简单字符串操作(如
FIND
、REPLACE
)
-