ABAP中正则表达式的简单使用

来源:互联网 发布:淘宝迅雷会员充值 编辑:程序博客网 时间:2024/04/29 16:37

转自老白的blog, 正好有个需求用到正则,转一下:

 

原贴地址: http://blog.chinaunix.net/u1/40527/showart.php?id=1336138

 

关于正则表达式的问题,特举例简单说明一下。
另外,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 'sap@sap.com'.
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

======以下本人跟据上文测试=====================================
需求,验证以两个字母开头(不分大小写),以数字02结尾的字符串, 代码:

SPAN {font-family: "Yahei Mono";font-size: 10pt;color: #000000;background: #FFFFFF;}.L0S52 {color: #0000FF;}
  DATA: regex   TYPE REF TO cl_abap_regex,
        matcher TYPE REF TO cl_abap_matcher,
        match   TYPE .
SPAN {font-family: "Yahei Mono";font-size: 10pt;color: #000000;background: #FFFFFF;}.L0S31 {font-style: italic;color: #808080;}.L0S33 {color: #4DA619;}.L0S52 {color: #0000FF;}
    CREATE OBJECT regex

      EXPORTING

        pattern     = '^[a-zA-Z]{2}02'

        ignore_case = 'X'.

    TRY.

        CALL METHOD regex->create_matcher

          EXPORTING

            text    = ps_werks-low

          RECEIVING

            matcher = matcher.

        TRY.

            CALL METHOD matcher->match "是否完全匹配

              RECEIVING

                success = match.

          CATCH cx_sy_matcher .

            gv_msg =  'ERROR'.

        ENDTRY.

      CATCH cx_sy_matcher .

        gv_msg =  'ERROR'.
    ENDTRY.



    IF match NE 'X'.
      gv_msg =  'ERROR'. ELSE.
gv_msg =  'OK'.
ENDIF.




 

 

原创粉丝点击