使用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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:


使用ABAP正则表达式解析HTML标签的更多相关文章
- Java正则表达式解析网页源码
<!DOCTYPE html> <html lang="zh-Hans"> <head> <meta charset="utf- ...
- java对身份证验证及正则表达式解析
原文地址:http://www.cnblogs.com/zhongshengzhen/ java对身份证验证及正则表达式解析 package service; import java.text.Par ...
- 用正则表达式解析XML
import java.util.regex.*; import java.util.*; /** * * <p>Title: Document</p> * * <p&g ...
- 正则表达式 替换 <img > 标签
/** * 正则表达式过滤<img > 标签 * @param str * @return */ public static String cutOutImgPrefix(String s ...
- Java中正则表达式去除html标签
Java中正则表达式去除html的标签,主要目的更精确的显示内容,比如前一段时间在做类似于博客中发布文章功能,当编辑器中输入内容后会将样式标签也传入后台并且保存数据库,但是在显示摘要的时候,比如显示正 ...
- Dubbo原理和源码解析之标签解析
一.Dubbo 配置方式 Dubbo 支持多种配置方式: XML 配置:基于 Spring 的 Schema 和 XML 扩展机制实现 属性配置:加载 classpath 根目录下的 dubbo.pr ...
- 【死磕 Spring】----- IOC 之解析 bean 标签:开启解析进程
原文出自:http://cmsblogs.com import 标签解析完毕了,再看 Spring 中最复杂也是最重要的标签 bean 标签的解析过程. 在方法 parseDefaultElement ...
- IOS开发---菜鸟学习之路--(二十一)-利用正则表达式解析URL获取其中的参数
因为项目需要解析URL当中参数的部分,在网上搜索了一下都没有相关的资料. 然后就自己写了一个 其实我就是通过正则表达式来处理URL 进行解析的 好了直接上代码吧 也是非常的简单,大家拷贝过去就可以使用 ...
- 小程序使用wxParse插件解析html标签图片间距问题
转自:https://www.cnblogs.com/likun123/p/9543376.html 小程序解析html标签,就需要用到wxParse啦.但是在解析连续图片的时候,会发现图片之间会有间 ...
随机推荐
- 创建Android本地repo
/**************************************************************************** * 创建Android本地repo * 说明 ...
- I.MX6 MAC Address hacking
/************************************************************************** * I.MX6 MAC Address hack ...
- 【hdu 5418】 Victor and world
[题目链接] 点击打开链接 [算法] 状压DP f[i][S]表示走的最后一步在i,状态为S 于是我们可以用最短路径 + 状压DP解决此题,由于不存在负边,所以可以用dijkstra+堆优化 [代码] ...
- Keepalived + HAProxy 搭建【第二篇】Keepalived 的安装与配置
第一步:准备 1. 简介 本文搭建的是利用 Keepalived 实现 HAProxy 的热备方案,即两台主机上的 HAProxy 实例同时运行,其中全总较高的实例为 MASTER,MASTER出现异 ...
- 架构:MVVC
ylbtech-架构:MVVC MVVM是Model-View-ViewModel的简写.它本质上就是MVC 的改进版.MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻 ...
- 通过链接将JSP页面中一变量传到另一JSP界面中
A.jsp 发送 <a herf="B.jsp?name=<%=name%>">传递到B页面</a> B.jsp 接收 <%String ...
- (转载) 上传文件进度事件,进度事件(Progress Events)
转载URL:https://www.w3cmm.com/ajax/progress-events.html MDN参考:https://developer.mozilla.org/zh-CN/docs ...
- 笔记:重新认识CSS3
1.CSS3边框 border-radius box-shadow border-image 2.CSS3背景 background-image background-size background- ...
- python 蓝牙模块pybluz安装
最近项目运用了蓝牙,所以来学一学蓝牙. 经过查阅,知道python的蓝牙模块是pybluz,然后老管理进行安装 出错,提示“Could not find the Windows Platform SD ...
- iOS [CIContext initWithOptions:]: unrecognized selector sent to instance 模拟器 iOS 8.4
在模拟器(iPhone 4s,iOS 8.4)中运行应用时, 应用crash在了使用CIContext(options:nil) 这个API的一个纯Swift第三方库. StackOverFlow的解 ...