2014-09-28 2 views
2

Я пытаюсь сопоставить любой оператор if, заканчивающийся на ::, и заменить его на «if (condition) then».Образец, который нужно совместить до тех пор, пока «::» не будет работать с string.gsub

Например:

if (x) :: 

следует заменить

if (x) then 

Я использую string.gsub для достижения этой цели, но мне кажется, что моя модель не является правильным. Следующий код соответствует только одному оператору 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.-):: генерирует вывод, который вы ожидаете:

if (x) then 

end 

if (y) then 

end 
+0

Я надеялся на выход сказать ', если (х), то end' ', если (у) тогда end' (в основном, заменяя any :: на «then».) Однако мне нужно сопоставить всю инструкцию if, а не только :: – David

+0

Right; Я ошибся; следует использовать '-'. –

+0

А, это сработало! Спасибо! – David

Смежные вопросы