使用ABAP正则表达式解析HTML标签

需求就是我用ABAP的某个函数从数据库读取一个字符串出来,该字符串的内容是一个网页。

网页的form里包含了很多隐藏的input field。我的任务是解析出name为svyValueGuid的input field的值:FA163EEF573D1ED89E89C7FE5E7C4715

使用ABAP正则表达式解析HTML标签_第1张图片

最简单粗暴的做法是:利用ABAP的FIND FIRST OCCURRENCE关键字首先找到svyValueGuid的偏移量,然后从这个偏移量出发,再找到第一个>的偏移量,这样问题就化简为在子串type="hidden" value="FA163EEF573D1ED89E89C7FE5E7C4715",这样问题就简单多了。但是这种办法比较笨重,代码很冗余。

有没有更快捷的办法呢?那就是使用ABAP regular expression,即正则表达式。

请看下列的测试代码:

REPORT ztest_interface.

DATA: lv_input TYPE string,

reg_pattern TYPE string.

lv_input = `` &&

`
Jerry's Programming Skill survey
` && `
` && `` && `` && `` && `
` && ``. reg_pattern = '.*svyValueGuid(?:.*)value="(.*)">.*SurveyId.*'. TRY. DATA(lo_regex) = NEW cl_abap_regex( pattern = reg_pattern ). DATA(lo_matcher) = lo_regex->create_matcher( EXPORTING text = lv_input ). IF lo_matcher->match( ) <> abap_true. WRITE:/ 'fail in input scan!'. RETURN. ENDIF. DATA(lt_reg_match_result) = lo_matcher->find_all( ). READ TABLE lt_reg_match_result ASSIGNING FIELD-SYMBOL() INDEX 1. READ TABLE -submatches ASSIGNING FIELD-SYMBOL() INDEX 1. data(lv_sub) = lv_input+-offset(-length). WRITE:/ 'result: ', lv_sub. CATCH cx_root INTO DATA(cx_root). WRITE:/ cx_root->get_text( ). RETURN. ENDTRY.

执行结果:

解决问题的核心思路是这个正则表达式:.svyValueGuid(?:.)value="(.)">.SurveyId.*

通过捕获分组操作符,一对小括号,将32位的GUID值进行捕获。这种解法比FIND FIRST OCCURANCE的代码量要少。

使用ABAP正则表达式解析HTML标签_第2张图片

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

你可能感兴趣的:(abap,sap,saprfc,正则表达式)