Lua模式排除

时间:2014-11-21 20:42:41

标签: string lua lua-patterns

我有一个预定义的代码,例如"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])

2 个答案:

答案 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"通过使用模式中的第一个和第二个捕获。