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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:54:56