ABAP 正则表达式
对于新用户来说,正则表达式(通常称为 regex)通常是复杂而令人生畏的。在深入探讨新功能之前,我想简要介绍一下 RegEx 的一般情况,并举例说明 ABAP 中明确编写的 RegEx。
FIND 'A' IN 'ABCD1234EFG'
MATCH COUNT sy-tabix.
WRITE: sy-tabix.
ABAP 通过语句 FIND
和 REPLACE
以及类 CL_ABAP_REGEX
和 CL_ABAP_MATCHER
支持正则表达式。类 CL_ABAP_MATCHER
将使用 CL_ABAP_REGEX
生成的正则表达式应用于字符串或内部表。
FIND ALL OCCURRENCES OF PCRE '[A-Z]' IN 'ABCD1234EFG'
MATCH COUNT sy-tabix.
WRITE: sy-tabix.
贪婪符号"(.*)
“的输出是整个输入句子,而懒惰符号” (.*?)
"的输出是 “Jack”、"Jill "和 "hill "三个单词。 如果在懒惰情况下省略 "ALL OCCURRENCES OF “表达式,则只能找到第一个”“和后面的”"之间的子串,即 “Jack”。
在 7.55 版之前,ABAP 仅使用 POSIX 库进行 RegEx。从那时起,也支持 Perl 库。这两个库在计算匹配的方式上有很大不同。由于 POSIX 已经过时,我们将在下文中使用 Perl 风格的 regexes。您只需在 AS ABAP 中运行 DEMO_REGEX 报告,就可以通过玩转 Regex 来尝试不同的表达式。
DATA(text) = `"Jack" and "Jill" went up the "hill"`.
FIND ALL OCCURRENCES OF PCRE `"(.*?)"` IN text IGNORING CASE
RESULTS DATA(result_tab).
IF sy-subrc = 0.
LOOP AT result_tab ASSIGNING FIELD-SYMBOL(<result>).
cl_demo_output=>write( substring( val = text off = <result>-offset len = <result>-length ) ).
ENDLOOP.
ENDIF.
cl_demo_output=>display( ).
PCRE 库是一组用 C 语言编写的函数,使用与 Perl 5 相同的语法和语义实现正则表达式模式匹配,并拥有自己的本地 API。PCRE 语法是 "Perl 兼容正则表达式 "的缩写,比 POSIX 语法或许多其他正则表达式库更强大、更灵活,性能也比 ABAP 支持的 POSIX 正则表达式更好。
要粗略了解 PCRE 的功能,可以查看三篇系列博文的第一部分,其中介绍了 ABAP 语言正则表达式的主要改进。这些系列博文的第二部分还详细解释了从 POSIX 到 PCRE 的迁移过程。
使用 PCRE 语法的 RegEx 可以在添加 PCRE 语句 FIND 和 REPLACE 以及字符串内置函数 PCRE 参数后指定。PCRE 正则表达式的对象可以使用系统类 CL_ABAP_REGEX 的工厂方法 CREATE_PCRE 创建,以便在语句 FIND 和 REPLACE 或系统类 CL_ABAP_MATCHER 中使用。
DATA(text) = `oooababboo`.
FIND PCRE 'a.|[ab]+|b.*' IN text
MATCH OFFSET DATA(moff)
MATCH LENGTH DATA(mlen).
IF sy-subrc = 0.
cl_demo_output=>write( substring( val = text off = moff len = mlen ) ).
ENDIF.
- 点赞
- 收藏
- 关注作者
评论(0)