如何在Lua 5.1或Neovim中用正则匹配多种文件扩展名?
Lua文件扩展名匹配问题解决
你的代码失效的核心原因是Lua的字符串模式匹配不支持标准正则的|分支语法,你写的%.(mp4|mkv|avi|mov|flv|wmv)$里的|会被当成普通字符处理,自然匹配不到目标扩展名。
解决方案1:用表集合快速判断扩展名(推荐)
这种方式无需循环,利用Lua表的键查找特性实现高效判断,完全符合你的需求:
local myFile = "/test/file.mp4" -- 定义合法扩展名集合,键存储实现O(1)快速查找 local validExtensions = { ["mp4"] = true, ["mkv"] = true, ["avi"] = true, ["mov"] = true, ["flv"] = true, ["wmv"] = true } -- 提取转小写后的文件扩展名 local ext = myFile:lower():match("%.(%w+)$") -- 检查扩展名是否合法 if validExtensions[ext] then print("match") end
解决方案2:纯模式匹配(可读性稍弱)
如果坚持要用单个模式匹配,可利用字符类组合覆盖所有目标扩展名(均为3个字符):
local myFile = "/test/file.mp4" -- 构建适配Lua模式的匹配规则 if myFile:lower():match("%.([mawf][pkovlv][4vie4v])$") then print("match") end
注:该模式通过字符类逐个位置匹配扩展名的可能字符,虽然能实现需求,但可读性远不如表集合方式,仅适合简单场景。
原代码失效的细节说明
Lua的字符串匹配使用的是模式匹配语法,而非标准正则表达式,其中不支持(a|b)这类分支语法。你原代码中的(mp4|mkv|...)会被解析为包含括号和竖线的普通字符串匹配规则,自然无法匹配.mp4这类正常的扩展名格式。
内容的提问来源于stack exchange,提问作者Carson
相关产品推荐
相关产品推荐

