2014-11-21 4 views
2

나는 미리 정의 된 코드를 가지고 있습니다. "12-345-6789"이고 첫 번째와 마지막 부분을 루아 패턴으로 일치 시키려고합니다. "12-6789". 두 번째 숫자 세트와 하이픈을 제외하면 작동하지만 패턴이 있거나 가능하면 알아낼 수 없습니다.루아 패턴 제외

나는 내가 그렇게

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]) 
+1

일치시킬 수있는 허용되는 문자열을 나열 할 수 있습니까? – hjpotter92

답변

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 
0

, 부 누군가가 여전히 유용 할 수 있습니다.

당신은 당신이 단순히 첫 번째를 사용하여 문자열 "12-6789"를 반환 것

local code = "12-345-6789" 
local result = string.gsub(code, "(%d+)%-%d+%-(%d+)", "%1-%2") 

이에 대한 string.gsub를 사용할 수 하이픈으로 구분 된 숫자의 첫 번째와 마지막 세트를해야하는 경우 패턴에서 두 번째 캡처.