2014-09-28 3 views
2

나는 ::로 끝나는 if 문과 일치 시키려고하고 'if (condition) then'으로 바꿉니다. 예를 들어"::"가 string.gsub와 작동하지 않을 때까지 일치시킬 패턴

:

if (x) :: 

은 내가 이것을 달성하기 위해 string.gsub을 사용하고

if (x) then 

로 대체하지만 내 패턴이 정확하지 않은 것 같습니다해야한다. 다음 코드는 하나의 if 문과 만 일치하지만, 모든 문과 일치 시키길 원합니다.

local code = [[ 

    if (x) :: 

    end 

    if (y) :: 

    end 

]] 

print(code:gsub("(if.+)::", "%1 then")) 

--[[ 
    what I wanted: 

    if (x) then 

    end 

    if (y) then 

    end 



    what I got: 

    if (x) :: 

    end 

    if (y) then 

    end 
]] 

내가 잘못하고있는 것이 확실하지 않습니다. 누구든지 도와 줄 수 있습니까?

답변

3

code:gsub("(if.-)::", "%1 then"); + 대신에 -을 사용하십시오. 반복을 "비 탐욕적"으로 만들고 "임의의 문자"를 가장 적게 캡처합니다. 원본 패턴의 .+은 줄의 끝까지 모든 것을 일치시킨 다음 ::을 찾을 때까지 역 추적하지만 마지막 것만 찾습니다. 그래서 당신은 단지 하나의 교체를 얻습니다.

if (x) then 

end 

if (y) then 

end 
+0

I 출력 기대했다 '경우 (x)는 다음 end' 다음'경우 (Y) end' 말 : (if.-)::를 사용

출력이 예상 생성 (기본적으로 ::를 'then'으로 바꿉니다.) 그러나 다음과 같은 if 문 전체를 일치시켜야합니다. : – David

+0

Right; 나는 그 패턴을 잘못 입력했다. '-'를 사용해야합니다. –

+0

아, 작동했습니다! 고맙습니다! – David