You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:55:15