我有一个预定义的代码,例如"12-345-6789"
,并且希望将第一个和最后一个部分与Lua模式匹配,例如" 12-6789&#34 ;.排除第二个数字集和连字符应该可以工作,但我无法用模式计算出来或者是否有可能。
我知道我可以像这样单独捕捉每个
code = "12-345-6789"
first, middle, last = string.match(code, "(%d+)-(%d+)-(%d+)")
并使用它,但我需要大量的代码重写。理想情况下,我想采用模式匹配的当前表并添加它以与string.match
一起使用lcPart = { "^(%d+)", "^(%d+%-%d+)", "(%d+)$", ?new pattern here? }
code = "12-345-6789"
newCode = string.match(code, lcPart[4])
答案 0 :(得分:3)
您无法通过一次捕获执行此操作,但将两次捕获的结果拼接在一起是微不足道的:
local first, last = string.match(code, "(%d+)%-%d+%-(%d+)")
local newid = first .. "-" .. last
如果您尝试匹配模式列表,最好将其重构为函数列表:
local matchers = {
function(s) return string.match(s, "^(%d+)") end,
function(s) return string.match(s, "^(%d+%-%d+)") end,
-- ...
function(s)
local first, last = string.match(code, "(%d+)%-%d+%-(%d+)")
return first .. "-" .. last
end,
}
for _,matcher in ipairs(matcher) do
local match = matcher(code)
if match then
-- do something
end
end
答案 1 :(得分:0)
我知道这是一个旧线程,但有人可能仍然觉得这很有用。
如果你只需要用连字符分隔的第一组和最后一组数字,你可以使用string.gsub
local code = "12-345-6789"
local result = string.gsub(code, "(%d+)%-%d+%-(%d+)", "%1-%2")
这将只返回字符串" 12-6789"通过使用模式中的第一个和第二个捕获。