首页 > 其他分享 >使用 ABAP 正则表达式提高字符串解析的执行效率

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

时间:2023-07-01 14:47:00浏览次数:49  
标签:regex REGEX 正则表达式 lo lv 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方法确保两种方式返回的结果完全相同。

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



今天继续写根据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端做要高效。



标签:regex,REGEX,正则表达式,lo,lv,ABAP,字符串
From: https://www.cnblogs.com/sap-jerry/p/17519257.html

相关文章

  • 字符串在货币、日期、精度的处理
    1.区域设置--locale模块的setlocale函数区域设置是一个标识特定地理、文化和语言的系统参数。它影响如日期和时间格式、货币和数字格式以及其他地域相关的操作。在Python中,使用 locale.setlocale() 函数可以设置区域设置来适应不同的地区和语言要求。该函数的语法为:local......
  • 2023ACM暑假训练day 6-字符串
    目录DAY6字符串训练情况简介题DAY6字符串训练地址:传送门训练情况简介题题意:思路:......
  • 字符串格式化
    1.什么是字符串格式化?就是把字符串弄成⼀定的格式(往往就是留个位置,往里面填值)这个位置往往是格式符、占位符。2.字符串常见的3种格式化方式2.1格式符+%+变量/表达式2.2f'{变量或表达式}'也叫 f-strings 2.3 字符串对象的 format() 方法来格式化字符串3.格式......
  • [转]前台传递给后台的JSON字符串中的引号 “” 在JAVA后台被转义为 &quot
    1、问题:前台数据,JSON字符串带有引号“”,数据被传递到后台,引号被转义为&quot,后台无法解析。前台数据如下:正常后台数据如下:大部分正常,只有JSON字符串中的“”被转义为&quot2、解决:方法一:使用apache的lang包里的方法StringappJson=StringEscapeUtils.un......
  • Oracle CONNECT BY根据特定字符拆分字符串
    1、一行SELECTT.ID,REGEXP_SUBSTR(T.VALS,'[^,]+',1,LEVEL)ASVALFROM(SELECT'101'ID,'A,B'VALSFROMDUAL)TCONNECTBYLEVEL<=REGEXP_COUNT(T.VALS,'[^,]+');2、多行2-1、如果ID唯一不重复:SELECTT.ID,REGEXP_SUBSTR......
  • [代码]如何分析XML字符串(LINQ to XML)
    此代码演示如何使用XElement.Parse()方法分析XML字符串,并创建XElement元素。从编程效率来讲这种做法可能效率非常的高,但从代码的执行效率来看,还是使用函数构造的方式创建XML树的效率高一点。示例代码usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSys......
  • Base64编码和解码字符串
    Base64编码和解码字符串packagecom.example.core.mydemo.cpic;importorg.apache.commons.codec.binary.Base64;/***strEncode=aGVsbG8gd29ybGQ=*strDecode=helloworld*/publicclassBizRequestBase64Test{privatestaticfinalStringCHAR_SET_UTF_8=......
  • mysql 如何 使用一个字符串来进行排序
    如果想进行对一个字段进行排序,但是这个字段却不是int类型,适应varchar类型怎么办呢?常用的方式:给字符字段加上0,举例:1:假设scoreRate是一个varchar类型,并且值是一个百分(90%)的数据格式.要求:请获取scoreRate值最高的一条数据:sql:select*fromresultTableorderbyreplace(sco......
  • 处理字符串
    后端返回的字符串需要放到el-table-column中,有的字符串有换行符,显示在页面中是"XXXXXXXXXX\nXXXXXX",用v-html\white-space\正则处理str.replace(/\n/g,'<br>')都不行;仔细查看后端返回的原字符串为"XXXXXXXXXX\\nXXXXXX",用正则处理str.replace(/\\n/g,'<br>')后再用v-......
  • C++代码中字符串分多行时的情况
    #include<iostream>intmain(constintargc,constchar*argv[]){std::stringstrSql1="select*fromtable\whereid=1\andname='name'";std::cout<<strSql1<<std::endl;std::stringst......