我想得到一个字符串:"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
(第二个返回值3
是gsub
执行的替换次数;你大概不需要它)
我假设您的下一步将是loadstring
这段代码,以评估它。这样做的时候要非常小心;至少使用沙盒环境(即,不访问任何全局变量的环境,理想情况下甚至可以临时更改字符串元表)。这甚至不能防止像while 1 do end
这样简单的DoS攻击,但至少它不会使擦除文件系统变得微不足道。
如果您确定输入将始终在这样的配置中,则可以使用gsub,使用捕获组(字符串模式周围的括号)。
str:gsub("(%d+d%d+)", function(roll) return "rolar('"..roll.."')" end)
捕获的模式%d+d%d
被传递给你给gsub作为参数的函数,然后你可以用任何你想要的修改重新插入回字符串。