关于abap:使用-ABAP-正则表达式提高字符串解析的执行效率

57次阅读

共计 1942 个字符,预计需要花费 5 分钟才能阅读完成。

在 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 端做要高效。

正文完
 0