如何在Lua中一次性去除字符串中的路径与文件扩展名?
一次匹配获取不含路径和扩展名的文件名
当然可以用单次string.match实现,结合Lua正则的特性,直接用下面的正则表达式就能完成需求:
local path = "C:/Users/mail/Desktop/Something/Test.mp3" local filename = string.match(path, ".*[/\\](.+)%.[^.]+$") print(filename) -- 输出: Test
正则解释:
.*[/\\]:匹配路径中最后一个正斜杠(/)或反斜杠(\)之前的所有内容(Lua里正则的\\是转义后的反斜杠,用来匹配Windows路径中的反斜杠)(.+):贪婪捕获最后一个斜杠后、最后一个点(.)之前的所有字符——这就是我们要的不含扩展名的文件名%.[^.]+$:匹配最后一个点及其后面的扩展名部分,确保捕获的内容截止到最后一个点之前
兼容场景测试:
- 相对路径:输入
"Doc.pdf",输出"Doc" - 含多个点的文件名:输入
"C:/Files/Report.v2.pdf",输出"Report.v2" - Windows反斜杠路径:输入
"C:\\Users\\Docs\\Note.txt",输出"Note"
如果需要兼容无扩展名的文件(比如"C:/Files/Readme"),可以调整正则为:
local filename = string.match(path, ".*[/\\]([^/\\.]+)$")
这个正则会捕获最后一个斜杠后所有非斜杠、非点的字符,不过这会和你原本两次匹配的逻辑略有差异——原本的逻辑在无扩展名时会返回nil,而这个正则会返回文件名本身。
内容的提问来源于stack exchange,提问作者JimPancakes
相关产品推荐
相关产品推荐

