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

3
假设我有一个字符串如下。
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个回答

4

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

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

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

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

你的 stringDecide 函数将不用修改就可以工作,正如你所看到的

在你现有的代码中,你想要发生的是 string.gsub 将会为每一个匹配调用 stringDecide,并将捕获到的字符串替换为每个调用中的 stringDecide 字符串参数,但实际上发生的是,在 string.gsub 被调用之前,stringDecide 被调用一次,使用字面量参数 "%1",并返回预期的 "ERROR",基本上将你的 string.gsub 调用展开为 string.gsub(a, '{(.-)}', "ERROR")


谢谢,这正是我想要的效果。 - user3542684

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接