ABAP中正则表达式语法,用法以及完整示例

目录

1.ABAP 中的正则表达式语法

基础语法元素

1. 1字符匹配

1.2 预定义字符类

1.3 位置锚点

1.4量词(重复匹配)

1.5分组与捕获

1.6特殊构造

 零宽断言

模式修饰符

2.基本用法

2.1创建正则表达式对象

2.2创建匹配器

2.3简写形式

3. 常用方法

3.1检查是否匹配

3.2查找所有匹配项

3.3获取匹配组

4.实用实例

4.1验证电子邮件格式

4.2提取日期

4.3分割字符串

4.4正则表达式解析

主要结构

详细解析

整数部分 [1-9]\d{0,10}|(0{1})

小数部分 (\.\d{0,3}[1-9])?

示例匹配

 匹配任意两位数字但不能为00的正则表达式

5.ABAP 特有注意事项


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. [1-9]\d{0,10}|(0{1}) - 匹配整数部分

  2. (\.\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

  • 或者不匹配任何内容(因为整个小数部分是可选的)

示例匹配

这个正则表达式可以匹配以下格式的数字:

  • 整数:011212345678901(11位)

  • 小数:0.10.010.0010.0001123.456123.4001(最后一位小数不能是0)

  • 如果要匹配负数,可以在开头添加 -?

 匹配任意两位数字但不能为00的正则表达式

[1-9][0-9]|0[1-9]|[1-9]0
//更简洁的写法
(?!00)\d{2}   //使用负向先行断言来确保匹配的不是"00",然后匹配任意两位数字\d{2}。

5.ABAP 特有注意事项

  1. 大小写敏感:默认区分大小写,需设置 ignore_case 参数来忽略大小写

  2. Unicode 支持:ABAP 正则表达式完全支持 Unicode 字符

  3. 性能考虑:复杂正则表达式可能影响性能,建议:

    • 缓存频繁使用的正则表达式对象

    • 优先使用简单字符串操作(如 FINDREPLACE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值