【问题标题】:lua gsub special replacement producing invalid capture indexlua gsub 特殊替换产生无效的捕获索引
【发布时间】:2011-10-16 21:38:45
【问题描述】:

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

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

此代码生成错误:

捕获索引无效

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

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

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

【问题讨论】:

  • 您不会对 URL 的电子邮件进行编码,是吗?编码字符串中的%40 肯定会导致错误。就目前而言,上述内容适用于标准 LUA。
  • @vhallac:你应该把它写下来作为答案:ideone.com/fMRZ5
  • @muistooshort 我会,但没有迹象表明电子邮件地址已编码。
  • @vhallac:但如果变量真的是loginurl 并且问题中的代码只是演示代码,那么您的 URL 编码猜测可能会失败。当然是您的电话。
  • @vhallac 你是对的,电子邮件将来自网络表单。我如何确保编码的@(如 %40)不会引起问题?而且,就此而言,为什么会这样?谢谢大家:)

标签: regex lua replace gsub


【解决方案1】:

正如我在上面的 cmets 中所建议的,当电子邮件被编码为 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("%%", "%%%%")

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

【讨论】:

  • 几个月前给你投票了,然后今天又回到了这个答案,同时搜索了一个类似的神秘错误 w gsub,这再次修复了它:)
  • 谁能解释第二个gsub?我完全迷路了。函数(h)如何工作? h如何传递给函数?是 %x%x 只是找到任何东西之一,两次? lua-users.org/wiki/PatternsTutorial
【解决方案2】:

您确定您的问题不是您尝试在loginurl 上使用gsub 而不是loginstr

你的代码给了我这个错误(见http://ideone.com/wwiZk):

lua: prog.lua:2: attempt to index global 'loginurl' (a nil value)

这听起来与您所看到的相似。只需修复它以使用正确的变量:

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

说(见http://ideone.com/mMj0N):

emailAddress=tester@test.com password={password}

根据需要。

【讨论】:

  • 是的,你是对的。我正在考虑使用此处找到的 unescape 函数:lua.org/pil/20.3.html 你知道为什么在替换字符串中有转义字符串是个问题吗?
  • @Matt:我认为替换中的%4 将被解释为“第四个捕获组”,因此您需要将%40 设为%%40@,然后再致电gsub。如果您首先将字符串通过unescape 函数,您将获得@ 并且gsub 应该可以工作。我认为你应该等到 vhallac 回来并把他的评论作为答案写下来,然后再接受任何事情。
【解决方案3】:

我在 value 部分有这个,所以你需要使用 value:gsub("%%", "%%%%") 来转义值。。 p>

在json中替换“一些值”的例子:

local resultJSON = json:gsub(, "\"SOME_VALUE\"", value:gsub("%%", "%%%%"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多