首页 > 其他分享 >SAP ABAP 字符串内数字去前导零的两种方法(正则/拼接)

SAP ABAP 字符串内数字去前导零的两种方法(正则/拼接)

时间:2024-06-18 14:35:36浏览次数:10  
标签:TYPE 正则 WRITE ABAP text1 字符串 前导 SAP DATA

碰到一个小需求,需要把字符串里数字的前导0给去掉。

ABAP内,想对字符串做处理,把字符串内的数字进行去前导0,通常有两种思路,拆分处理再拼接或者直接用正则表达替换。

最初的想法是直接通过符号拆分,去前导0后拼回去,但是了解到实际分割的符号并不唯一。

所以直接用正则表达式来做替换会更加合适。

通过0(\d)来去掉0,0(\d)代表的是0+数字,通过这个方法可以去掉一到两位数字的前导0

点击查看代码
WRITE:/,'*通过0(\d)来去掉0,0(\d)代表的是0+数字,通过这个方法可以去掉一到两位数字的前导0'.
DATA    text2   TYPE string VALUE '01,02,04;03,05,08;06,09,010,20,025'.
WRITE:/,'去前导0之前的字符串:',text2.
REPLACE ALL OCCURRENCES OF REGEX '0(\d)' IN text2 WITH '$1'.
WRITE:/,'去前导0之后的字符串:',text2.

效果图:

但是我发现,如果出现3位数字的情况,会出BUG,比如105直接替换成15了

点击查看代码
WRITE:/,'*但是当出现三位数时,0(\d)是什么效果呢?'.
DATA    text3   TYPE string VALUE '01,04,05;02,05,06;08,09,10,18;90,100,105,110'.
WRITE:/,'去前导0之前的字符串:',text3.
REPLACE ALL OCCURRENCES OF REGEX '0(\d)' IN text3 WITH '$1'.
WRITE:/,'去前导0之后的字符串:',text3.
WRITE:/,'*可以看到,三位数数字的0一样会被删掉'.

效果图:

为了避免出现可能会出现的三位数BUG,所以匹配的字符多一位,采用(\D)0(\d),非数字+0+数字来作为匹配。

但是这样就漏掉开头的第一个数字了,所以再加一步[1]+去字符开头的前导0。

点击查看代码
WRITE:/,'*为了适应字符串内存在三位数及以上的情况,增加一个匹配项变成(\D)0(\d),这代表的是非数字+0+数字'.
WRITE:/,'*但是这样就会漏掉开头第一个数字,因为缺少了非数字的匹配项,所以加一步^[0]+,去掉开头的前导0'.
DATA    text4   TYPE string VALUE '01,04,05;02,05,06;08,09,010,18;090,0100,0105,0110'.
WRITE:/,'去前导0之前的字符串:',text4.
REPLACE ALL OCCURRENCES OF REGEX '(\D)0(\d)' IN text4 WITH '$1$2'.
WRITE:/,'通过(\D)0(\d)去前导0的字符串:',text4.
REPLACE ALL OCCURRENCES OF REGEX '^[0]+'     IN text4 WITH ''.
WRITE:/,'再去掉开头的前导0的字符串',text4.

效果图:

那么如果不用正则替换,怎么用拼接的方式实现去掉字符串里的前导零呢?

假如间隔的符号是固定的,直接拆分去前导零做拼接就行了。

点击查看代码
DATA text0   TYPE string VALUE '01,02,04,03,05,08,06,09,10,15,20,30,50,105,120'.
DATA txt0    TYPE string.
DATA num0(2) TYPE c VALUE 0.

WRITE:/,'*对固定符号间隔的字符串做处理,直接拆分做去前导0即可'.
WRITE:/,'去前导0之前的字符串:',text0.
*分割符号固定
*通过,分割放入内表
SPLIT text0 AT ',' INTO TABLE DATA(lt_text).

*去前导0后重新拼接
LOOP AT lt_text ASSIGNING FIELD-SYMBOL(<lt_text>).

  <lt_text> = |{ <lt_text> ALPHA = OUT }|.
  txt0 = |{ txt0 }{ COND #( WHEN txt0 IS NOT INITIAL THEN ',' ELSE '') }{ CONV dec03( <lt_text> ) }|.

ENDLOOP.
WRITE:/,'去前导0之后的字符串:' ,txt0.
效果图:


但是,分隔的符号出现多个时,SPLIT直接拆分就不太好用了。

首先用正则去掉数字,用拿到的分割符号给函数segment做拆分,再做拼接。

点击查看代码
DATA lt_asv   TYPE TABLE OF string .
DATA text1   TYPE string VALUE '01,02,04;03,05,08;06,09,10;15,20,30;50,105,120'.
DATA num1(3) TYPE c VALUE 0.
DATA num2(3) TYPE c VALUE 0.
DATA symbol  TYPE string.
DATA(text1_copy) = text1.

WRITE:/,'*对非固定符号间隔的字符串做拆分就需要用到segment函数'.
*但是分割符号不固定怎么办呢
REPLACE ALL OCCURRENCES OF REGEX '[0-9]' IN text1_copy WITH ''.
WRITE:/,'去前导0之前的字符串:',text1.
WRITE:/,'得到所有用于分割的符号:' ,text1_copy.
WRITE:/,'*这串字符将作为segment函数的space入参'.

DO.
  TRY.
      DATA(lv_data) = segment( val   = text1
                                index = sy-index
                                space = text1_copy ).
    CATCH cx_sy_strg_par_val.
      EXIT.
  ENDTRY.
  IF sy-subrc = 0.
    DATA:lt_data LIKE TABLE OF lv_data.
    APPEND lv_data TO lt_data.
  ENDIF.
ENDDO.

clear text1.
LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<lt_data>).
  <lt_data> = |{ <lt_data> ALPHA = OUT }|.
  num1 =  sy-tabix - 2.
  text1 = |{ text1 }{ COND #( WHEN text1 IS NOT INITIAL THEN text1_copy+num1(1) ELSE '') }{ CONV dec03( <lt_data> ) }|.
ENDLOOP.

WRITE:/,'去前导0之后的字符串:',text1.

效果图:


  1. 0 ↩︎

标签:TYPE,正则,WRITE,ABAP,text1,字符串,前导,SAP,DATA
From: https://www.cnblogs.com/SAPMXB/p/18254261

相关文章

  • ABAP简单代码实现上载Excel多Sheet页
    1classZCL_EXCEL_TOOLSdefinition2public3final4createpublic.56publicsection.78methodsUPLOAD9importing10!FILEtypeSTRING11returning12value(DATA)typereftoDATA.13methodsT......
  • python中常见re正则表达式(整数、小数、邮箱、号码、车牌、x开头y结尾)大合集(值得收
    目录专栏导读库的介绍库的安装1、匹配整数2、匹配某几位整数3、匹配小数4、匹配电话格式1:11位数字格式2:187-12341234或者187-1234-1234格式3:(123)456-7890,或者+86123-456-78905、匹配邮箱6、匹配车牌7、xx为开头yy为结尾9、匹配中文10、匹配非中文总结专栏导读......
  • 正则表达式合集
    //身份证正则表达式(15位) isIDCard1=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/; //身份证正则表达式(18位) isIDCard2=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/; 地区、性别和身份证进行判断的正则表达式: <script> va......
  • Python爬虫之路(12)--re正则表达式
    正则表达式认识正则正则表达式,又称规则表达式,(RegularExpression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个语法规则的......
  • HIT计算机系统CSAPP期末大作业
                                            计算机系统大作业题    目  程序人生-Hello’sP2P 专      业     数据科学与大数据技术                  学  号     202......
  • Java正则表匹配字符类
    以下是在java中使用正则表达式匹配字符类的一些示例。编号构造匹配说明1[abc]匹配a,b或c(简单类)。2[^abc]除a,b或c之外的任何字符(否定)。3[a-zA-Z]a到z或A到Z,包括(范围)。4[a-d[m-p]]a到d,或m到p:[a-dm-p](联合)。5[a-z&&[def]]d,e或F(交集)。6[a-z&&[^bc]]a到z,b和c除外:[ad-z](......
  • SAP: SALV Grid 单元格颜色
    1、SAP:SALVGrid单元格颜色2、详细程序代码*&---------------------------------------------------------------------**&ReportZ17_43*&*&---------------------------------------------------------------------**&SALV单元格颜色*&*&---------......
  • HIT CSAPP 计算机系统大作业 程序人生-Hello’s P2P From Program to Process
    摘 要本文借助hello.c跌宕起伏的一生——P2P(FromProgramToProcess)、020(FromZero-0toZero-0)从源代码到可执行程序以及和计算机系统硬件的配合,从计算机系统的角度阐述从源代码到可执行程序的转变,以及在计算机系统当中作为众多进程中的一员的运行过程。源程序首先经......
  • ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 添加自定义(GLSL)数据
    ArcGISJSAPI高级教程-ArcGISMapsSDKforJavaScript-添加自定义(GLSL)数据核心代码完整代码在线示例ArcGISMapsSDKforJavaScript从4.29开始增加RenderNode类,可以添加数据以及操作FBO(ManagedFBO);通过操作FBO,可以通过后处理实现很多效果,官方提供了几......
  • Python笔记 - 正则表达式
    正则表达式(RegularExpression,简称regex)是一种强大的工具,用于匹配字符串模式。在Python中,正则表达式通过re模块提供。本文将带你深入了解Python中的正则表达式,从基础概念到高级用法。1.什么是正则表达式?正则表达式是一种用来描述字符串模式的方法。它可以用来匹配、查找......