Lua中含+字符的字符串无法被string.gsub替换的问题解决咨询
Lua中含+字符的字符串无法被string.gsub替换的问题解决咨询
嗨,我来帮你搞定这个问题!
你遇到的问题根源在于Lua的string.gsub默认会把第一个参数当作模式匹配字符串,而不是普通的字面量字符串。这里的+是Lua模式里的特殊字符,表示匹配前面的字符一次或多次,所以当你用包含+的ANI去匹配时,它并不是在找字面的+,而是按照模式规则去匹配,自然就找不到对应的内容,替换也就失效了。
解决这个问题有两种常用的方法:
方法一:使用string.gsub的第四个参数开启 plain 模式
Lua的string.gsub其实支持第四个参数plain,当把它设为true时,匹配的字符串就会被当作纯字面量处理,不会解析其中的模式特殊字符。修改你的替换代码就行:
local finalRPID = string.gsub(rpid, ANI, MRPID, 1, true)
这里的1是指定只替换第一次出现的匹配项(和你原来的逻辑一致),最后一个true就是开启plain模式,这样+就会被当作普通字符处理了。
方法二:手动转义模式特殊字符
如果你不想用plain模式,也可以把ANI里的特殊字符(比如+、*、?这些)手动转义,在它们前面加上%。不过这种方法需要处理所有可能的特殊字符,不如plain模式方便,但如果有特殊需求也可以用:
-- 先转义ANI里的模式特殊字符 local escapedANI = string.gsub(ANI, "([%+%*%?%.%[%]%(%)%^%$%%])", "%%%1") local finalRPID = string.gsub(rpid, escapedANI, MRPID)
现在把完整的修正后的代码写出来,用方法一的话是这样:
rpid = "Remote-Party-ID:<sip:+19>;abc" local startRPID = string.find(rpid, "<") local endRPID = string.find(rpid, ">") local ANI = string.sub(rpid, startRPID, endRPID) local MRPID = "\"TEST\" "..ANI local finalRPID = string.gsub(rpid, ANI, MRPID, 1, true) print(finalRPID)
运行这段代码就能得到你想要的结果:Remote-Party-ID:"TEST" <sip:+19>;abc
备注:内容来源于stack exchange,提问作者Riyas Muhammad
相关产品推荐
相关产品推荐

