二维码

[其他] ABAP如何使用正则表达式

Twilight发表于 2015-11-10 10:41Anda 最后回复于 2016-02-01 15:01 [复制链接] 3145 1

正则表达式的作用无外乎三种:验证(是否符合规则)、查找(包含提取)、替换,其中有两种方法来使用:
一、类方法:
CL_ABAP_REGEX        regex就是regular expression的缩写,里面的方法不是很多,可能用到的也就只有构造方法和REATE_MATCHER这个方法。
CL_ABAP_MATCHER        matcher匹配的意思,也就是说所有的匹配规则都和它有关,里面具体方法,se24去查看

1、验证
  1. IF cl_abap_matcher=>matches( pattern = '\D+'
  2.                              text    = 'ZF25' ) = abap_true.
  3.   WRITE 'IS NUMBER'.
  4. ELSE.
  5.   WRITE 'IS NOT NUMBER'.
  6. ENDIF.
复制代码

输出结果:
  1. IS NOT NUMBER
复制代码

解释:CL_ABAP_MATCHER有一个静态方法,直接进行匹配。

2、查找
  1. DATA:matcher TYPE REF TO cl_abap_matcher,
  2.      matches TYPE match_result_tab,
  3.      match   LIKE LINE OF matches,
  4.      w_text  TYPE string.
  5. w_text =  '<a id="MyLinks1_NewPostLink"'
  6. & ' href="http://www.sapclub.cc/VerySky/admin/EditPosts.aspx?opt=1">'.
  7. matcher = cl_abap_matcher=>create( pattern  = 'http://.*(?=")'
  8.                                    text     = w_text ).
  9. matches = matcher->find_all( ).
  10. LOOP AT matches INTO match.
  11.   WRITE:/ w_text+match-offset(match-length).
  12. ENDLOOP.
复制代码

输出结果:
  1. http://www.sapclub.cc/VerySky/admin/EditPosts.aspx?opt=1
复制代码

解释:
  • 创建match实例(创建规则),构造方法中有pattern参数输入规则,IGNORE_CASE是否忽略大小写,SIMPLE_REGEX是否使用简单规则(具体参见F1帮助文档),
  • 在实例中有FIND_ALL(),FIND_NEXT()方法,可以用来查找。

这个方法是不是太麻烦了啊,不急有简单的方法,其实就是字符串处理中用到的。
  1. DATA: patt       TYPE string VALUE `n.?w`,
  2.       text       TYPE string,
  3.       result_tab TYPE match_result_tab.
  4. FIELD-SYMBOLS <match> LIKE LINE OF result_tab.
  5. FIND ALL OCCURRENCES OF REGEX patt IN
  6.       `Everybody knows this is nowhere`
  7.      RESULTS result_tab.
  8. LOOP AT result_tab ASSIGNING <match>.
  9.   WRITE: / <match>-offset, <match>-length.
  10. ENDLOOP.
复制代码

输出结果:
  1.         11           3
  2.         24           3
复制代码
  1. DATA: str TYPE string ,
  2.       result_tab TYPE match_result_tab ,
  3.       wa LIKE LINE OF result_tab.
  4. *找出STRING里面的双字节字符
  5. str = 'abc顾问adfsf大神'.
  6. FIND ALL OCCURRENCES OF REGEX '[^\x00-\xff]*' IN str RESULTS result_tab.
  7. LOOP AT result_tab INTO wa.
  8.   WRITE / str+wa-offset(wa-length).
  9. ENDLOOP.
复制代码

输出结果:
  1. 顾问
  2. 大神
复制代码

解释:大家都知道英文字母是单字节的,中文是双字节的,但是在ABAP里面用strlen等方法是区别不出单双字节的,这个实例中讲的不失为一个很好的办法。

3、替换
  1. DATA:matcher TYPE REF TO cl_abap_matcher,
  2.      count   TYPE i,
  3.      w_text  TYPE string,
  4.      w_newtext TYPE string.
  5. w_text    = 'hubinshishuibuzhidao'.
  6. w_newtext = 'FFF'.
  7. matcher = cl_abap_matcher=>create( pattern  = 'sh.?i'
  8.                                    text     = w_text ).
  9. WRITE:/ 'REPLACE BEFORE:', w_text.
  10. count = matcher->replace_all( newtext = w_newtext ).
  11. WRITE:/ 'REPLACE COUNT IS:', count.
  12. WRITE:/ 'REPLACE AFTER:', w_text.
复制代码

输出结果:
  1. REPLACE BEFORE: hubinshishuibuzhidao
  2. REPLACE COUNT IS:          2
  3. REPLACE AFTER: hubinshishuibuzhidao
复制代码

大家肯定会说了,字符串前后没有没替换啊。注意修改的不是W_TEXT本身,他将修改后的值放到了MATCHER->TEXT即match类实例的属性里面,我们只需令W_TEXT = MATCHER->TEXT即可。

修改后:
  1. DATA:matcher TYPE REF TO cl_abap_matcher,
  2.      count   TYPE i,
  3.      w_text  TYPE string,
  4.      w_newtext TYPE string.
  5. w_text    = 'hubinshishuibuzhidao'.
  6. w_newtext = 'FFF'.
  7. matcher = cl_abap_matcher=>create( pattern  = 'sh.?i'
  8.                                    text     = w_text ).
  9. WRITE:/ 'REPLACE BEFORE:', w_text.
  10. count = matcher->replace_all( newtext = w_newtext ).

  11. w_text = matcher->text.
  12. WRITE:/ 'REPLACE COUNT IS:', count.
  13. WRITE:/ 'REPLACE AFTER:', w_text.
复制代码

输出结果:
  1. REPLACE BEFORE: hubinshishuibuzhidao
  2. REPLACE COUNT IS:          2
  3. REPLACE AFTER: hubinFFFFFFbuzhidao
复制代码


二、字符串处理中的方法:
  1. DATA text TYPE string VALUE '-dfufdud-'.
  2. REPLACE ALL OCCURRENCES OF REGEX 'u' IN text WITH 'x'.
  3. WRITE text.
复制代码

输出结果:
  1. -dfxfdxd-
复制代码
回复

使用道具 举报

Anda
学习,好久不用这东西了
回复 支持 反对

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表