当前位置: 首页 > news >正文

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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

转载于:https://my.oschina.net/u/3771578/blog/2248737

相关文章:

  • 计算机英语学习笔记(六)
  • java多线程和长连接,三方转换通信的实践(1)——转换端程序
  • 【呆鸟译Py】这位老师的70个问题,100个数据分析师都想不全
  • 用Gmail做QQ邮件群发的一种方式
  • 机器人操作系统来到Windows
  • sublime text3
  • Spring Cloud 之 Consul 与 Consul 服务剔除
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 在ABAP里取得一个数据库表记录数的两种方法
  • 【Unity Shader】Shader基础
  • vue项目使用微信公众号支付
  • 你连这10个工具都不知道,还是程序员?
  • DDL语言
  • BZOJ 1568: [JSOI2008]Blue Mary开公司
  • Ubuntu 16.04 下 安装go
  • 2019.2.20 c++ 知识梳理
  • CSS3 变换
  • Java 23种设计模式 之单例模式 7种实现方式
  • javascript从右向左截取指定位数字符的3种方法
  • laravel with 查询列表限制条数
  • SpringBoot几种定时任务的实现方式
  • Vim Clutch | 面向脚踏板编程……
  • webpack入门学习手记(二)
  • windows-nginx-https-本地配置
  • 从tcpdump抓包看TCP/IP协议
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 前端自动化解决方案
  • 浅谈Golang中select的用法
  • 如何进阶一名有竞争力的程序员?
  • 深入浅出webpack学习(1)--核心概念
  • 学习笔记:对象,原型和继承(1)
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #define 用法
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (ros//EnvironmentVariables)ros环境变量
  • (八)Flask之app.route装饰器函数的参数
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (未解决)macOS matplotlib 中文是方框
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)甲方乙方——赵民谈找工作
  • ***检测工具之RKHunter AIDE
  • .NET 分布式技术比较
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .net6+aspose.words导出word并转pdf
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @31省区市高考时间表来了,祝考试成功
  • @RequestBody与@ResponseBody的使用
  • @Transient注解
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798