Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7133859
  • 博文数量: 655
  • 博客积分: 10264
  • 博客等级: 上将
  • 技术积分: 8278
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-04 17:47
个人简介

ABAP顾问

文章分类

全部博文(655)

文章存档

2017年(2)

2014年(8)

2013年(3)

2012年(2)

2011年(18)

2010年(102)

2009年(137)

2008年(274)

2007年(134)

分类:

2008-10-27 10:42:08

在一个论坛上面看到有人在问正则表达式的问题,特举例简单说明一下。
另外,REPLACE也支持REGEX关键字。
最后:只能是ECC6或者更高版本才可以(ABAP supports POSIX regular expressions as of Release 7.00)

REPORT  z_barry_test.

DATA: str TYPE string ,
      result_tab TYPE match_result_tab ,
      wa LIKE LINE OF result_tab.

*找出STRING里面的双字节字符
str = 'abc我啊adfsf们'.
FIND ALL OCCURRENCES OF REGEX '[^\x00-\xff]*' IN str RESULTS result_tab.
LOOP AT result_tab INTO wa.
  WRITE / str+wa-offset(wa-length).
ENDLOOP.

*找出STRING里面的单字节字符
str = 'abc我啊adfsf们'.
FIND ALL OCCURRENCES OF REGEX '[\x00-\xff]*' IN str RESULTS result_tab.
WRITE / '-----'.
LOOP AT result_tab INTO wa.
  WRITE / str+wa-offset(wa-length).
ENDLOOP.

*找出STRING里面的IP地址
str = 'IP1:172.16.32.12  IP2:192.168.1.1 '.
FIND ALL OCCURRENCES OF REGEX '\d+\.\d+\.\d+\.\d+' IN str RESULTS result_tab.
WRITE / '-----'.
LOOP AT result_tab INTO wa.
  WRITE / str+wa-offset(wa-length).
ENDLOOP.

*找出STRING里面的***-********格式的电话号码
str = 'IP1:172.16.32.12  021-12345678 '.
FIND ALL OCCURRENCES OF REGEX '\d{3}-\d{8}|\d{4}-\d{7}' IN str RESULTS result_tab.
WRITE / '-----'.
LOOP AT result_tab INTO wa.
  WRITE / str+wa-offset(wa-length).
ENDLOOP.

*找出STRING里面的15/18位身份证号码
str = 'IP1:172.16.32.12 3722198003041234 '.
FIND ALL OCCURRENCES OF REGEX '\d{15}|\d{18}' IN str RESULTS result_tab.
WRITE / '-----'.
LOOP AT result_tab INTO wa.
  WRITE / str+wa-offset(wa-length).
ENDLOOP.

***使用CLASS的例子:
REPORT  z_barry_test.
 
PARAMETERS: p_input TYPE string DEFAULT 'IP1:172.16.32.12  IP2:192.168.1.1 ' OBLIGATORY.
 
DATA: regex   TYPE REF TO cl_abap_regex,
      matcher TYPE REF TO cl_abap_matcher,
      match   TYPE c .
DATA: result_tab TYPE match_result_tab ,
      wa LIKE LINE OF result_tab.
 
CREATE OBJECT regex
  EXPORTING
    pattern     = '\d+\.\d+\.\d+\.\d+'
    ignore_case = 'X'.
 
TRY.
    CALL METHOD regex->create_matcher
      EXPORTING
        text    = p_input
*       table   =
      RECEIVING
        matcher = matcher .
  CATCH cx_sy_matcher .
ENDTRY.
 
TRY.
    CALL METHOD matcher->match "是否完全匹配
      RECEIVING
        success = match.
  CATCH cx_sy_matcher .
ENDTRY.
 
CALL METHOD matcher->find_all
  RECEIVING
    matches = result_tab.
LOOP AT result_tab INTO wa.
  WRITE / p_input+wa-offset(wa-length).
ENDLOOP.
 
 
 
***SAP给的判断Email地址的例子***
PARAMETERS email TYPE c LENGTH 30 LOWER CASE DEFAULT .
DATA matcher TYPE REF TO cl_abap_matcher.
matcher = cl_abap_matcher=>create( pattern = '\w+(\.\w+)*@(\w+\.)+(\w{2,4})'
                                   ignore_case = 'X'
                                   text = email ).
IF matcher->match( ) IS INITIAL.
  MESSAGE 'Wrong Format' TYPE 'I'.
ELSE.
  MESSAGE 'Format OK' TYPE 'I'.
ENDIF.
 
 
注:ECC6下有个专门测试正则表达式的工具程序:DEMO_REGEX_TOY
阅读(7940) | 评论(4) | 转发(1) |
1

上一篇:Oracle错误

下一篇:SAP中的通配符和转义符

给主人留下些什么吧!~~

qdbarry2011-06-30 11:23:19

没有研究过

chinaunix网友2011-06-27 09:41:47

老白,有没有研究过ABAP正则是否支持singleline模式? 默认是multiline的,匹配模式改不动,知道什么说法没?

chinaunix网友2008-11-28 15:23:51

ECC6下有个专门测试正则表达式的工具程序:DEMO_REGEX_TOY

ngk123ngk2008-11-05 15:34:21

你好白老师,我是一名刚毕业的大学生。由于公司的业务需求最近我看是学习sap.但是,在学习中有很多的困难,今天,我看了你的帖子,想照着你的例子,在计算机上调试,但是发生了很多的异常,比如:match_result_tab 与 OCCURRENCES等关键字在我的程序里面都提示没有相应的关键字。希望老师能给与我一些帮助,谢谢。 mail: ngk123ngk@163.com