ABAP 正则表达式

https://c.runoob.com/front-end/854/ 菜鸟上的在线正则测试网站,这上面通过了就能用在sap正则里面

REPORT ZDEMO_REGEX.


  DATA: gv_str    TYPE string ,
        gv_result TYPE string ,
        gt_result TYPE match_result_tab ,
        gs_result LIKE LINE OF gt_result.

  " 过滤双字节字符,如汉字、空格、标点
  CLEAR gv_result.
  gv_str = 'Hello 世界,今天天气 good.。'.
  FIND ALL OCCURRENCES OF REGEX '[^x00-xff]*' IN gv_str RESULTS gt_result.
  LOOP AT gt_result INTO gs_result.
    gv_result = gv_result && gv_str+gs_result-offset(gs_result-length).  " 通过偏移访问原字符串值
  ENDLOOP.
  WRITE: / gv_result.


  " 获取连续的A-Za-z英文字符[A-Za-z]+
  " 获取单个A-Za-z英文字符[A-Za-z]
  CLEAR gv_result.
  gv_str = 'Hello 世界,今天天气 good.。'.
  FIND ALL OCCURRENCES OF REGEX '[A-Za-z]+' IN gv_str RESULTS gt_result.
  LOOP AT gt_result INTO gs_result.
    gv_result = gv_result && gv_str+gs_result-offset(gs_result-length).  " 通过偏移访问原字符串值
  ENDLOOP.
  WRITE: / gv_result.


  " 获取连续的0-9数字字符[0-9]+
  " 获取单个0-9数字字符[0-9]
  CLEAR gv_result.
  gv_str = '今天想吃1个馒头,两个包子,3个馍馍'.
  FIND ALL OCCURRENCES OF REGEX '[0-9]+' IN gv_str RESULTS gt_result.
  LOOP AT gt_result INTO gs_result.
    gv_result = gv_result && gv_str+gs_result-offset(gs_result-length).  " 通过偏移访问原字符串值
  ENDLOOP.
  WRITE / gv_result.

"正则压缩json字符串空格
DATA lv_str TYPE string.
lv_str = '{                               '    &&
      '    "REQ_DATA": {               '    &&
      '        "IT_INPUT": [{          '    &&
      '            "BANKS": "",        '    &&
      '            "BANKL": "",        '    &&
      '            "BANKA": "  *银行"      '    &&
      '        }                       '    &&
      '        ],                      '    &&
      '        "IV_GUID": "1234"       '    &&
      '    }                           '    &&
      '}                               '.

REPLACE ALL OCCURRENCES OF REGEX '\s(?=([^"]*"[^"]*")*[^"]*$)' IN lv_str WITH ''. " 正则压缩json字符串空格

" 文件名提取
FIND ALL OCCURRENCES OF REGEX '[^/\\]+[/\\]*$' IN ls_file_table-filename RESULTS lt_result.
IF sy-subrc = 0.
  READ TABLE lt_result INTO ls_result INDEX 1.
  ls_zdemo_file-file_name      = ls_file_table-filename+ls_result-offset(ls_result-length).  " 通过偏移取文件名(带后缀)
  ls_zdemo_file-file_extension = ls_zdemo_file-file_name.

  REPLACE ALL OCCURRENCES OF REGEX '\.\w*' IN ls_zdemo_file-file_name      WITH ''.  " 正则删除后缀,取文件名
  REPLACE ALL OCCURRENCES OF REGEX '.+\.'   IN ls_zdemo_file-file_extension WITH ''.  " 正则删除文件名,取后缀
ENDIF.

新发现,abap里面字符串类型和char类型,正则的处理结果不一致,发现是char类型不足位则末尾有空格

DATA: lv_char TYPE char10.
DATA: lv_string TYPE string.

lv_char = '1234'.
REPLACE ALL OCCURRENCES OF REGEX '[ ]+$' IN lv_char WITH '!'. " 正则会把末尾的六个空格换成!
WRITE / lv_char.  " 1234!

lv_char = '1234--'.
REPLACE ALL OCCURRENCES OF REGEX '[-]+$' IN lv_char WITH '!'. " 正则匹配不到末尾的短横线,因为末尾全是空格
WRITE / lv_char.  " 1234--

lv_char = '1234------'.
REPLACE ALL OCCURRENCES OF REGEX '[-]+$' IN lv_char WITH ''. " 正则匹配末尾全部短横线
WRITE / lv_char.  " 1234

" 字符串类型末尾没有空格影响
lv_string = '1234--'.
REPLACE ALL OCCURRENCES OF REGEX '[-]+$' IN lv_char WITH ''. " 正则匹配末尾全部短横线
WRITE / lv_char.  " 1234

" 类似去除末尾字符的还有这个方法,对char和string都生效
lv_char = shift_right( val = lv_char sub = |-| ).
lv_string = shift_right( val = lv_string sub = |-| ).
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值