在LUA中是否有一个函数来替换字符串上的值,但保留原始值的一部分?



我想得到一个字符串:"1d6+1d12-1d20+5"

变成这样:"rolar('1d6')+rolar('1d12')-rolar('1d20')+5"

要点是xdy应替换为rolar('xdy'),但应保留该部分的原始值。我一直试图这样做与string:gsub,但没有能够保持原来的xdy值。

模式是简单的"一个或多个数字,然后是字母d,然后是一个或多个数字"。将其替换为用字符串字面值&调用rolar.

str:gsub("%d+d%d+", "rolar('%1')")

其中str是您的字符串-例如:

> ("1d6+1d12-1d20+5"):gsub("%d+d%d+", "rolar('%1')")
rolar('1d6')+rolar('1d12')-rolar('1d20')+5  3

(第二个返回值3gsub执行的替换次数;你大概不需要它)

我假设您的下一步将是loadstring这段代码,以评估它。这样做的时候要非常小心;至少使用沙盒环境(即,不访问任何全局变量的环境,理想情况下甚至可以临时更改字符串元表)。这甚至不能防止像while 1 do end这样简单的DoS攻击,但至少它不会使擦除文件系统变得微不足道。

如果您确定输入将始终在这样的配置中,则可以使用gsub,使用捕获组(字符串模式周围的括号)。

str:gsub("(%d+d%d+)", function(roll) return "rolar('"..roll.."')" end)

捕获的模式%d+d%d被传递给你给gsub作为参数的函数,然后你可以用任何你想要的修改重新插入回字符串。

相关内容

  • 没有找到相关文章

最新更新