利用lua中的string.gsub来巧妙实现json中字段的正则替换

原创 2016年05月30日 14:27:29

业务需求

工作中需要对某个请求的json响应中的某个字段进行替换, 通常想到的方法是,先使用lua的cjson模块解析该json响应, 取出该json字段再该改写它的值.

在这样实现的过程中,遇到一些问题,表现如下:

(1).上面的方法需要经过json解码, 修改字段值, json编码的过程, 在json编码过程中, 会将完整的url进行转义,比如

http://101.227.23.53/videos/v0/20151026/88/fc/8adcec584a283b2ce0aacb15092918f5.mp4

会被转义为

http:\/\/101.227.23.53\/videos\/v0\/20151026\/88\/fc\/8adcec584a283b2ce0aacb15092918f5.mp4

这不是我们需要的,因为我们还需要将\去掉,比较繁琐;

(2).有些响应是js片段, 而不是标准的json

这样套用cjson处理的话,将会出错, 而且实际线上的情况非常复杂, 异常处理非常不好处理, 比如, 可能返回这样的响应

var videoUrl={code:"A00000",data:{"l":"http://101.227.23.53/videos/v0/20151026/88/fc/8adcec584a283b2ce0aacb15092918f5.mp4?key=8446d65833da155a&src=iqiyi.com&qypid=411714900_33&v=851447025&qd_src=app&qd_tm=1463727282000&qd_ip=117.146.18.238&qd_sc=ebde1fe754678856abc597e7c689b19e&mbd=10020202ddf238a3ed4b7fbac0e1c989_4.9.1_&uuid=759240d6-573eb992-3d","t":"CMNET|XinJiang-117.146.64.214","z":"xinjiang_cmnet","h":"0","e":"0"}};

或者

[{"fileid":"030008070057160DFAB40F32C1770EA3DF4CF3-E4DF-28B8-FCCE-3EDFBEB73802.mp4","server":"http://111.206.106.204/youku/69780130BBF468394EFD494E56/030008070057160DFAB40F32C1770EA3DF4CF3-E4DF-28B8-FCCE-3EDFBEB73802.mp4"}]

解决方法

放弃json的解码和编码, 直接采用字符串的正则匹配替换.这样处理更简练

下面是处理源码

#!/usr/bin/lua

function mod_hosts(h, s)
    return h .. "10.10.110.162:8081/" .. s .. "/acjf92lbq/"
end

--利用正则匹配来替换指定部分的host字段
s = 'var videoUrl={code:"A00000",data:{"l":"http://101.227.23.53/videos/v0/20151026/88/fc/8adcec584a283b2ce0aacb15092918f5.mp4?key=8446d65833da155a&src=iqiyi.com&qypid=411714900_33&v=851447025&qd_src=app&qd_tm=1463727282000&qd_ip=117.146.18.238&qd_sc=ebde1fe754678856abc597e7c689b19e&mbd=10020202ddf238a3ed4b7fbac0e1c989_4.9.1_&uuid=759240d6-573eb992-3d","t":"CMNET|XinJiang-117.146.64.214","z":"xinjiang_cmnet","h":"0","e":"0"}};'
l = string.gsub(s, '(\"l\"%s*:%s*\"http://)(.-)/', mod_hosts("%1", "%2"))
print(l)

运行截图


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Lua 字符串替换函数 string.gsub(s, pat, repl [, n])

Lua 字符串替换函数 string.gsub(s, pat, repl [, n]) 原文链接:http://blog.csdn.net/zhangxaochen/article/details/...

Lua与json字符串转换之UTF8

UTF8编码是一种针对Unicode的可变长度编码,用在网页上可以同一页面显示中文简体繁体以及其他语言(日韩文等)的字形,又称万国码,其编码字节数为1~6个。详情可以参见百度百科 在Lua中读取js...

lua中使用json:table转json与json转table

直接上代码: json.lua ----------------------------------------------------------------------------- -- JSO...

LUA 捕获、正则、截取、替换

function trim(s) return (string.gsub(s,"^%s*(.-)%s*$","%1")); end a=" 8.1" print(a); --正则方法: _,...

lua的string库与强大的模式匹配

lua原生解释器对字符串的处理能力是十分有限的,强大的字符串操作能力来自于string库。lua的string函数导出在string module中。在lua5.1,同时也作为string类型的成员方...

Lua正则表达式

. 任意字符 %s 空白符 %p 标点字符 %c 控制字符 %d 数字 %x 十六进制数字 %z 代表0的字符 %a 字母 %l 小写字母 %u 大写字母 %w 字母和数字 上面...
  • cceevv
  • cceevv
  • 2013-11-27 11:20
  • 8463

lua正则表达式

LUA中关于正则表达式是本文要介绍的内容,LUA中的正则表达式跟传统的不一样,作者特把手册里一段关于正则说明抄下来,做个记录,这些只是简单的说明一下LUA中正则的则规,对于后面的高级应用以后再慢慢研究...

每周荐书:Java Web、Python极客编程、移动Web前端(评论送书)

每周荐书:Java Web、Python极客编程、移动Web前端(评论送书) 各位抱歉,上周活动停更一周,本周继续感谢大家对每周荐书栏目的支持,先公布下上期活动中奖名单 微雨燕凝霜寒森林之舟架构探险:...

Lua 字符串查找函数 string.find(s, pattern [, init [, plain]] )

原文链接:http://blog.csdn.net/zhangxaochen/article/details/8084396 函数原型 string.find(s, pattern [, i...

Lua_第19章 String 库(下)

19.3捕获(Captures) Capture(下面译为捕获或者capture,模式中捕获的概念指,使用临时变量来保存匹配的子模式,常用于 向前引用。)是这样一种机制:可以使用模式串的一...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)