如何用Lua的string.match匹配1次、2次、3次或0次指定内容?
解决方案
问题出在你之前的?用法错误——你把?加在了捕获组的匹配内容后,而非整个下划线+捕获组的结构上,导致模式依然要求三个下划线存在才能匹配。
正确写法(兼容原匹配逻辑,允许包含后缀)
直接将第三个下划线和对应捕获组设为可选的非捕获组:
local filename1 = "Help1_Index of Contents_Comments_EN.png" local filename2 = "Help1_Index of Contents_Comments.png" -- 处理三个下划线的情况 local first, second, third = filename1:match("_(.-)_(.-)(?:_(.-))?") -- first = "Index of Contents", second = "Comments", third = "EN.png" -- 处理两个下划线的情况 first, second, third = filename2:match("_(.-)_(.-)(?:_(.-))?") -- first = "Index of Contents", second = "Comments.png", third = nil
优化写法(排除文件后缀,仅提取下划线分隔字段)
如果希望捕获的字段不包含.png这类后缀,可以调整模式先跳过前缀和后缀:
-- 兼容任意后缀的通用模式 local pattern = "^[^_]+_(.-)_(.-)(?:_(.-))?.*$" -- 三个下划线的情况 local first, second, third = filename1:match(pattern) -- first = "Index of Contents", second = "Comments", third = "EN" -- 两个下划线的情况 first, second, third = filename2:match(pattern) -- first = "Index of Contents", second = "Comments", third = nil
模式说明:
^[^_]+_:跳过开头到第一个下划线的前缀(比如Help1_),不捕获(.-):非贪婪匹配第一个下划线分隔字段_(.-):匹配第二个下划线分隔字段(?:_(.-))?:可选的非捕获组,匹配第三个下划线分隔字段(不存在则返回nil).*$:跳过剩余的后缀内容,不捕获
内容的提问来源于stack exchange,提问作者Rai
相关产品推荐
相关产品推荐

