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

时间:2016-12-12 01:11:53

标签: regex lua

我一直在尝试开发一个用于在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它不起作用。它几乎就像可选角色需要在那里一样?

感谢您提前获得帮助,我一直都在与正则表达式斗争。

3 个答案:

答案 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