使用正则表达式识别XdY+Z或XdY

我一直在尝试开发一个程序,用于在MMORPG中进行DM,但我无法解析所需的实际正则表达式。

引用自我在另一个不活跃论坛上的帖子:

我正式接管了多年前的DiceRoller插件,并且自从接管以来重新设计了很多,并在游戏中进行了很多测试。虽然我还没有上传任何内容,但我一直在努力解决目前对插件设计至关重要的正则表达式问题。

一些背景:DiceRoller插件的最新迭代使您可以在突击聊天窗口中输入“!XdY”(其中X是骰子数,Y是骰子值),而拥有插件的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,它不起作用。几乎好像必须存在可选字符?

提前感谢您的帮助,我一直在苦苦挣扎正则表达式。

点赞
用户5288316
用户5288316

Lua 的正则表达式非常有限。你需要使用 ^!(%d+)[dD](%d+)(?:+(%d+))?$,但是由于 (?:+(%d+))? 使用了一个非捕获组,以及一个带有修饰符的组,这两个功能在 Lua Patterns 中都不支持。

考虑使用一个支持使用 PCRE、PHP 正则表达式引擎的正则表达式库,比如这个。但如果你只想用它来处理这个正则表达式,那就有些杀鸡焉用牛刀了。你可以通过编码完成这个简单的任务,不会太难。

2016-12-12 03:01:12
用户1442917
用户1442917

虽然 Lua 模式并不足够强大以一个表达式解析它(因为它们不支持可选分组),但是有一个使用两个表达式处理它的简单选项:

-- 首先检查更长的表达式
local count, size, modifier = string.match(message, "^!(%d+)[dD](%d+)+(%d+)$")
if not count then
  count, size = string.match(message, "^!(%d+)[dD](%d+)$")
end
2016-12-12 07:20:13
用户6834680
用户6834680
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
2016-12-12 08:29:38