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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
简介: 使用 ABAP 正则表达式提高字符串解析的执行效率

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方法确保两种方式返回的结果完全相同。

57d3aabf7d8ad1b32d3d9b9ef2160a52_format,png.png两种方法都很快, BP的在4677毫秒之间,我的在4452微秒之间,正好快了一个数量级。

今天继续写根据attachment instance guid读取具体attribute的代码。

BP的代码,又比如他们call 这个FM去把ls_key:


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


a0c2815e8a45dbeb05cbb70fbac9b4e9_format,png.png


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

83b98ea6eaa166787511111ed4e1ede4_format,png.png

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

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


相关文章
|
2月前
|
SQL 开发框架 前端开发
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
|
2月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
214 1
如何根据文件夹中文件,生成对应名字的图片,名称一样的路径,这里用到了变量,将集合定义在外面,字符串拼接,正则表达式截取.jpg文件
如何根据文件夹中文件,生成对应名字的图片,名称一样的路径,这里用到了变量,将集合定义在外面,字符串拼接,正则表达式截取.jpg文件
|
3月前
|
Python
Python使用正则表达式分割字符串
在Python中,你可以使用re模块的split()函数来根据正则表达式分割字符串。这个函数的工作原理类似于Python内置的str.split()方法,但它允许你使用正则表达式作为分隔符。
|
3月前
|
存储 算法 数据挖掘
深入解析力扣166题:分数到小数(模拟长除法与字符串操作详解及模拟面试问答)
深入解析力扣166题:分数到小数(模拟长除法与字符串操作详解及模拟面试问答)
|
4月前
|
SQL 存储 JSON
Hive 解析 JSON 字符串数据的实现方式
Hive 提供 `get_json_object` 函数解析 JSON 字符串,如 `{"database":"maxwell"}`。`path` 参数使用 `$`、`.`、`[]` 和 `*` 来提取数据。示例中展示了如何解析复杂 JSON 并存储到表中。此外,Hive 3.0.0及以上版本内置 `JsonSerDe` 支持直接处理 JSON 文件,无需手动解析。创建表时指定 `JsonSerDe` 序列化器,并在 HDFS 上存放 JSON 文件,可以直接查询字段内容,方便快捷。
|
4月前
|
移动开发 iOS开发
非标准h5字符串的WKWebView展示前的解析与插入属性或标题头与解决WKWebView无法加载视频首帧问题
非标准h5字符串的WKWebView展示前的解析与插入属性或标题头与解决WKWebView无法加载视频首帧问题
36 1
|
3月前
|
XML 数据采集 自然语言处理
掌握Python字符串:全面解析与实战指南
掌握Python字符串:全面解析与实战指南
|
26天前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
49 6
|
1天前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件

推荐镜像

更多
下一篇
云函数