ABAP 正则表达式

举报
雨绸缪 发表于 2023/10/30 16:07:51 2023/10/30
【摘要】 对于新用户来说,正则表达式(通常称为 regex)通常是复杂而令人生畏的。在深入探讨新功能之前,我想简要介绍一下 RegEx 的一般情况,并举例说明 ABAP 中明确编写的 RegEx。FIND 'A' IN 'ABCD1234EFG' MATCH COUNT sy-tabix. WRITE: sy-tabix.ABAP 通过语句 FIND 和 REPLACE 以及类 CL_ABAP_R...

对于新用户来说,正则表达式(通常称为 regex)通常是复杂而令人生畏的。在深入探讨新功能之前,我想简要介绍一下 RegEx 的一般情况,并举例说明 ABAP 中明确编写的 RegEx。

FIND 'A' IN 'ABCD1234EFG'
  MATCH COUNT sy-tabix.
  WRITE: sy-tabix.

ABAP 通过语句 FINDREPLACE 以及类 CL_ABAP_REGEXCL_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.
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。