我一直在尝试开发一个用于在MMORPG中进行DMing的程序,但是我在解析我需要的实际正则表达式时遇到了问题。
引用自己来自不太活跃的论坛上的另一个帖子:
我已经多年前正式接管了DiceRoller插件,并且自从我接管并在游戏中进行了大量测试以来,我已经重新修改了它。虽然我还没有上传任何内容,但我一直在努力研究目前对插件设计至关重要的正则表达式。
一些背景:DiceRoller插件的最新版本使得它可以输入"!XdY" (其中X是骰子的数量,Y是骰子值)进入raid聊天,而拥有插件的DM将在插件(随机数lua协议)中经过一些逻辑,然后在添加骰子后吐出输入
如下:
local count, size = string.match(message, "^!(%d+)[dD](%d+)$")
现在我需要它做的功能是解析"!XdY"或者" XdY + Z",但似乎我无法接近" XdY + Z"无论我使用哪个正则表达式,因为我需要它来做两个表达式。如有必要,我可以提供更多的源代码上下文。
这是我最接近的:
http://i.imgur.com/eMhPHQB.png
这是正则表达式:
local count, size, modifier = string.match(message, "^!(%d+)[dD](%d+)+?(%d+)$")
正如您所看到的,使用修改器它可以正常工作。但是,删除修饰符,正则表达式仍然认为它是" XdY + Z"等等" 1d20"它认为它是" 1d2 + 0"。它会认为1d200是" 1d20 + 0"等等。我试过移动可选角色"?"但它只是导致表达根本不起作用。如果我这样做!1d2它不起作用。它几乎就像可选角色需要在那里一样?
感谢您提前获得帮助,我一直都在与正则表达式斗争。
答案 0 :(得分:2)
local function dice(input)
local count, size, modifier = input:match"^!(%d+)[dD](%d+)%+?(%d*)$"
if count then
return tonumber(count), tonumber(size), tonumber("0"..modifier)
end
end
for _, input in ipairs{"!1d6", "!1d24", "!1d200", "!1d2+4", "!1d20+24"} do
print(input, dice(input))
end
输出:
!1d6 1 6 0
!1d24 1 24 0
!1d200 1 200 0
!1d2+4 1 2 4
!1d20+24 1 20 24
答案 1 :(得分:0)
Lua正则表达式非常有限。您需要使用^!(%d+)[dD](%d+)(?:+(%d+))?$
,但由于(?:+(%d+))?
使用非捕获组和组中的修饰符,因此不支持这种情况,Lua模式不支持这两种情况。
考虑使用像this one这样的正则表达式库,允许您使用PCRE,PHP正则表达式引擎,这是最完整的引擎之一。但如果您只想将它用于此正则表达式,那将是一种过度杀伤力。你可以通过代码来完成,对于像这样的简单任务来说不会那么难。
答案 2 :(得分:0)
虽然Lua模式的功能不足以用一个表达式解析它(因为它们不支持可选组),但有一个简单的选项可以用两个表达式来处理它:
-- check the longer expression first
local count, size, modifier = string.match(message, "^!(%d+)[dD](%d+)+(%d+)$")
if not count then
count, size = string.match(message, "^!(%d+)[dD](%d+)$")
end