假设我有一个像这样的字符串。
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"的字面解释。字符串?
答案 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}