如何修改Lua字符串模式以获取带点的文件扩展名?
问题描述
我有一个用于拆分路径、文件名和扩展名的Lua函数,代码如下:
local function SplitPath(path) -- 返回路径、文件名和扩展名三个值 return string.match(path, "^(.-)([^\\/]-)%.([^\\/%.]-)%.?$") end local p, f, e = SplitPath("C:\\Users\\Public\\Documents\\rl_my_tool.lua") print("- Path: " .. p) print("- Filename: " .. f) print("- Extension: " .. e)
该函数基本满足需求,但返回的扩展名不带点(例如仅返回lua而非.lua)。我不擅长字符串模式,尝试修改仍未成功,需要帮助。
解决方案
要让扩展名包含点,只需调整正则捕获组,将点纳入扩展名的捕获范围即可,修改后的函数如下:
local function SplitPath(path) -- 返回路径、文件名和带点的扩展名三个值 return string.match(path, "^(.-)([^\\/]-)(%.[^\\/%.]-)%.?$") end
改动说明
- 原模式中
%.([^\\/%.]-)的写法是将点放在捕获组外,仅捕获点后的扩展名内容; - 修改为
(%.[^\\/%.]-)后,点会和扩展名内容一起被第三个捕获组匹配,最终返回的扩展名就会是.lua这类带点的格式。
测试示例:
local p, f, e = SplitPath("C:\\Users\\Public\\Documents\\rl_my_tool.lua") print("- Path: " .. p) -- 输出:C:\Users\Public\Documents\ print("- Filename: " .. f) -- 输出:rl_my_tool print("- Extension: " .. e) -- 输出:.lua
如果需要兼容无扩展名的文件(如readme这类),可以调整模式让扩展名组可选:
local function SplitPath(path) return string.match(path, "^(.-)([^\\/]-)(%.?[^\\/%.]-)%.?$") end
这种情况下,无扩展名的文件会返回空字符串作为扩展名,文件名末尾有点的文件(如note.)则会返回.作为扩展名,可根据实际需求调整。
内容的提问来源于stack exchange,提问作者Rai
相关产品推荐
相关产品推荐

