打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用 ABAP 正则表达式提高字符串解析的执行效率
userphoto

2023.06.29 上海

关注

在 ABAP(Advanced Business Application Programming)中,正则表达式(Regular Expressions)是一种强大的工具,可用于处理字符串和文本数据。正则表达式可以帮助您执行各种任务,如查找和替换文本、验证输入格式或拆分字符串。本文将介绍在 ABAP 中使用正则表达式的几种方法。

  1. 使用 CL_ABAP_REGEX 类

ABAP 提供了一个名为 CL_ABAP_REGEX 的类,用于处理正则表达式。此类提供了许多实用方法,如创建正则表达式对象、查找匹配项、替换文本等。以下是使用 CL_ABAP_REGEX 类的一些示例。

1.1 创建正则表达式对象

要使用正则表达式,首先需要创建一个正则表达式对象。可以使用 CL_ABAP_REGEX 类的构造函数 CREATE 建立一个新的对象。

DATA(regex) = CL_ABAP_REGEX=>CREATE( pattern = `your_regex_pattern` ).

1.2 查找匹配项

要查找与正则表达式匹配的文本,可以使用 CL_ABAP_REGEX 类的 FIND 方法。此方法会返回一个布尔值,指示是否找到了匹配项。

DATA: lv_pattern TYPE string VALUE `your_regex_pattern`,
   lv_subject TYPE string VALUE `your_text`.

DATA: lo_regex   TYPE REF TO cl_abap_regex,
   lo_matcher TYPE REF TO cl_abap_matcher.

lo_regex = cl_abap_regex=>create( pattern = lv_pattern ).
lo_matcher = lo_regex->create_matcher( text = lv_subject ).

IF lo_matcher->find( ).
  "匹配成功
ELSE.
  "匹配失败
ENDIF.

1.3 获取匹配的文本

要获取匹配的文本,可以使用 CL_ABAP_MATCHER 类的 GROUP 方法。此方法返回匹配的文本。

DATA: lv_matched_text TYPE string.

IF lo_matcher->find( ).
  lv_matched_text = lo_matcher->get_group( 0 ).
ENDIF.

1.4 替换文本

要使用正则表达式替换文本,可以使用 CL_ABAP_REGEX 类的 REPLACE 方法。此方法会返回一个新字符串,其中所有匹配项都已替换为指定的替换文本。

DATA: lv_replacement TYPE string VALUE `your_replacement_text`,
   lv_result   TYPE string.

lv_result = lo_regex->replace( 
   exporting
  text = lv_subject
  replacement = lv_replacement
   importing
  count = DATA(matches) ).
  1. 使用 REPLACE 和 SPLIT 关键字

ABAP 语言还提供了两个关键字,用于处理正则表达式:REPLACE 和 SPLIT。这些关键字简化了正则表达式的使用,但功能相对有限。

2.1 使用 REPLACE 关键字替换文本

REPLACE 关键字允许您使用正则表达式替换文本。以下是一个示例,其中使用正则表达式将所有数字替换为井号(#)。

DATA: lv_text TYPE string VALUE `123abc456`.

REPLACE ALL OCCURRENCES OF REGEX `[0-9]` IN lv_text WITH `#`.

"输出结果:###abc###

下面笔者分享一个自己实际工作中使用 ABAP 正则表达式的一个例子。

分别取AG3 100个task与其attachment的关联关系(就是 source – target guid的link), 分别用BP和我自己的实现,用compare_link方法确保两种方式返回的结果完全相同。

两种方法都很快, BP的在46~77毫秒之间,我的在44~52微秒之间,正好快了一个数量级。

今天继续写根据attachment instance guid读取具体attribute的代码。 BP的代码,又比如他们call 这个FM去把ls_key:

这个FM的作用就是解析用两个/分隔开的document type: L, document class: CRM_L_ORD和document guid。

这个FM用的传统的做法,把三个k split到一个internal table里,然后READ TABLE INDEX 1,2,3的方式分别取出每个key。用了42行代码。

其实1行代码就搞定所有的事情:

而且后者比前者快3~6倍:因为FIND REGEX是用c++实现的,比在ABAP端做要高效。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
怎样用正则表达式从给定的字符串中找到匹配规则的字符串
JAVA与正则表达式
JAVA正则表达式
java正则表达式 非捕获组,捕获组详解
正则表达式
java正则表达式及api
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服