使用正则表达式识别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,它不起作用。几乎好像必须存在可选字符?
提前感谢您的帮助,我一直在苦苦挣扎正则表达式。
虽然 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
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
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

Lua 的正则表达式非常有限。你需要使用
^!(%d+)[dD](%d+)(?:+(%d+))?$,但是由于(?:+(%d+))?使用了一个非捕获组,以及一个带有修饰符的组,这两个功能在 Lua Patterns 中都不支持。考虑使用一个支持使用 PCRE、PHP 正则表达式引擎的正则表达式库,比如这个。但如果你只想用它来处理这个正则表达式,那就有些杀鸡焉用牛刀了。你可以通过编码完成这个简单的任务,不会太难。