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

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

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

最简单粗暴的做法是:利用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 = `<body>` &&

`<div class="Title">Jerry's Programming Skill survey</div>` &&

`<form action="Survey.htm?sap-client=001">` &&

`<input name="svyApplicationId" type="hidden" value="CRM_SURVEY_ACTIVITY">` &&

`<input name="svyValueGuid" type="hidden" value="FA163EEF573D1ED89E89C7FE5E7C4715">` &&

`<input name="SurveyId" type="hidden" value="JERRY_TEST">` &&

`<div Id="" class="Section1">` && `</form></body>`.

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(<match>) INDEX 1.

READ TABLE <match>-submatches ASSIGNING FIELD-SYMBOL(<sub>) INDEX 1.

data(lv_sub) = lv_input+<sub>-offset(<sub>-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的代码量要少。

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

【干货】从配置到实例:MyBatis 基础入门

本质而言,ORM(Object-Relation Mapping),是一种编程技术,能够实现面向对象编程语言与关系型数据库之间的数据转换(映射)。

12820
来自专栏Java3y

移动商城第五篇(用户模块)【用户登陆、回显用户、拦截器、收货地址】

移动商城【用户登陆、回显用户】 我们来实现用户登陆的功能: ? 当点击的时候,出来的是一个弹出框,我们想要切换成一个页面。 ? 找到对应的事件、切换成我们的页面...

63170
来自专栏Android知识点总结

SpringBoot-07-之数据库JPA(CRUD)

14720
来自专栏Java帮帮-微信公众号-技术文章全总结

JDBC基础入门(3)

事务 事务是由一步/几步数据库操作序列组成的逻辑执行单元, 这些操作要么全部执行, 要么全部不执行. 注: MySQL事务功能需要有InnoDB存储引擎的支持,...

37170
来自专栏专注 Java 基础分享

初识Hibernate之关联映射(二)

     上篇我们介绍了关联映射的几种形式,有单向多对一,单向一对多,还有双向一对多。本篇接着介绍有关关联映射的其他几种映射方式,主要有以下几种: 基于外键的单...

24250
来自专栏大内老A

谈谈基于SQL Server 的Exception Handling[上篇]

对于所有的开发人员来说,Exception Handling是我们每天都要面对的事情。对于基于Source Code的Exception Handling,我想...

19150
来自专栏MasiMaro 的技术博文

驱动开发中的常用操作

这篇文章会持续更新,由于在驱动中,有许多常用的操作代码几乎不变,而我自己有时候长时间不用经常忘记,所以希望在这把一些常用的操作记录下来,当自己遗忘的时候,有个参...

19040
来自专栏GopherCoder

专栏:012:没时间解释了,快使用sqlalchemy

17760
来自专栏跟着阿笨一起玩NET

单件模式Singleton来控制窗体被重复或多次打开

本文转载:http://blog.csdn.net/a0700746/article/details/4473796

8520
来自专栏我的博客

Python操作Mysql类

#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb from warnings import fi...

31680

扫码关注云+社区

领取腾讯云代金券