如何在lua中将捕捉内容与另一个字符串进行比较?

假设我有一个字符串,如下所示。

string = "This is just an {example} of a string. {Quite} boring."

在代码的某个地方,我想使用一个函数将花括号中的单词替换为其他内容。我在手册中查阅了一些资料,并想出了以下解决方案。

function stringModify(a)
  return string.gsub(a, '{(.-)}', stringDecide("%1"))
end

function stringDecide(a)
  if a == "example" then
    return "excellent example"
  elseif a == "Quite" then
    return "Not"
  else
    return "ERROR"
  end
end

只是这并不像我想要的那样有效。例如,在 if 部分中,将变量 a 视为文字“%1”,而不是捕获的内容。

如何让它根据捕获内容进行比较,而不是将“%1”字符串字面意义解释为文本?

点赞
用户458360
用户458360

你不必使用整个 %1 的方式来将捕获传递给函数。string.gsub的一种可能的操作模式是将函数作为参数,并在每次找到匹配时传递一个表示捕获的字符串/字符串数组:

捕获值的最后一个用途可能是最强大的。我们可以将string.gsub调用一个函数作为第三个参数,而不是替换字符串。当以这种方式调用时,每次string.gsub发现匹配时都会调用给定函数; 该函数的参数是捕获的内容,而函数返回的值则用作替换字符串。

考虑到这一点,你可以 只需从现有代码中删除一些字符,以便传递函数而不是调用它:

function stringModify(a)
  return string.gsub(a, '{(.-)}', stringDecide)
end

而你的stringDecide函数将不需要修改,正如你可以看到的那样

在您现有的代码中,您想要发生的是string.gsub将为每个匹配调用stringDecide,在每次调用时将捕获的字符串代替stringDecide中的字符串参数,但实际发生的是stringDecidestring.gsub被调用之前一次性使用文字参数%1进行调用,并且像预期的那样返回“ERROR”,基本上在原地展开您的string.gsub调用到string.gsub(a,'{(.-)}',“ERROR”)

2014-04-16 20:06:31