匹配的模式直到" ::"不使用string.gsub

时间:2014-09-28 20:28:12

标签: string lua gsub lua-patterns

我试图匹配任何以::结尾的if语句,并将其替换为' if(condition)然后'。

例如:

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
]]

我不确定我做错了什么。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

使用code:gsub("(if.-)::", "%1 then");请注意使用-代替+因为它使重复“非贪婪”并且它将捕获最小数量的“任何字符”。原始模式中的.+将所有内容匹配到行尾,然后回溯直到找到::,但它只找到最后一个;这就是为什么你只能换一个。

使用(if.-)::生成您期望的输出:

if (x)  then

end

if (y)  then

end