如何将捕获的内容与lua中的另一个字符串进行比较

时间:2014-04-16 19:53:34

标签: string lua gsub

假设我有一个像这样的字符串。

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"的字面解释。字符串?

1 个答案:

答案 0 :(得分:4)

您无需执行整个%1操作即可将捕获传递给您的函数。 One possible mode of operation of string.gsub takes a function as an argument and passes it a string/array of strings representing the capture(s) every time it finds a match:

  

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

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

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

,您的stringDecide功能将不加修改,as you can see

在您现有的代码中,您希望发生的是string.gsub将为每个匹配调用stringDecide,在每次调用时将捕获到字符串参数中的字符串替换为stringDecide ,但实际上发生的事情是stringDecide"%1"被调用之前被文字参数string.gsub调用一次,它按预期返回"ERROR",基本上正在扩展string.gsub string.gsub(a, '{(.-)}', "ERROR")来电{{1}}。{/ 1}