regex - lua gsub 特殊替换产生无效的捕获索引

标签 regex lua replace gsub

我有一段 lua 代码(在 Corona 中执行):

local loginstr = "emailAddress={email} password={password}"
print(loginstr:gsub( "{email}", "tester@test.com" ))

此代码生成错误:

捕获索引无效

虽然我现在知道这是因为在 gsub 模式中没有正确指定花括号,但我不知道如何修复它。

我应该如何形成 gsub 模式,以便我可以用电子邮件地址值替换占位符字符串?

我浏览了所有我能找到的面向 lua 的网站,但大多数文档似乎都围绕着不相关的情况。

最佳答案

正如我在上面的评论中所建议的,当电子邮件被编码为 URL 参数时,用于编码“@”字符的 %40 将用作捕获索引。由于搜索模式没有任何捕获(更不用说 40 个),这将导致问题。

有两种可能的解决方案:您可以对编码字符串进行解码,或者对替换字符串进行编码以转义其中的“%”字符。根据您要对最终结果执行的操作,您可能需要同时执行这两项操作。

以下例程(我从 here 获取 - 未测试)可以解码编码字符串:

function url_decode(str)
  str = string.gsub (str, "+", " ")
  str = string.gsub (str, "%%(%x%x)",
      function(h) return string.char(tonumber(h,16)) end)
  str = string.gsub (str, "\r\n", "\n")
  return str
end

为了转义字符串str中的%字符,你可以使用:

str:gsub("%%", "%%%%")

'%' 字符被转义为 '%%',并且在搜索模式和替换模式中都需要转义(因此替换中的 % 字符数量)。

关于regex - lua gsub 特殊替换产生无效的捕获索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7787509/

相关文章:

php preg_match_all 返回数组数组

lua - 在Lua中,如何在用户将值留空后防止程序崩溃?

javascript - 如何将此正则表达式替换从替换单个单词更改为替换单词数组?

Java替换字符串2

C++11 正则表达式不匹配任何内容

c# - 正则表达式匹配后如何选择n个字符

file-io - 从文件读取后的命令行输入

lua - 如何发现lua环境中可用的内容?

firebase - 在 Firestore 安全规则中使用替换功能

regex - ANTLR4 词法分析器匹配行尾