正确的模式在Lua gmatch中不起作用

时间:2014-01-19 19:44:51

标签: lua

例如我们有一个字符串

local str = "12345:some.address.ru:1234"

我们需要将此字符串解析为:

var1 = "12345"   -- mandatory
var2 = "some.address.ru"  -- can be nil
var3 = "1234"   -- can be nil

我写过这样的代码:

for var1, var2, var3 in str:gmatch('^(%d+)%:?([%a.]*)%:(%d+)$') do
print(var1)
print(var2)
print(var3)
end

但我没有收到任何结果。如果我在模式的开头删除了simbol ^它运行良好。 有什么问题?为什么它不能用于simbol ^,我该如何解决? (我需要检查这个模式是从字符串的开头开始的)

有没有机会在没有循环的情况下完成这项工作? (我的字符串不包含多于1个模式)

由于

1 个答案:

答案 0 :(得分:4)

manual说明gmatch

  

模式开头的插入符'^'不能用作锚点,因为这会阻止迭代。

您不需要循环,因此不需要gmatch。只是做

var1, var2, var3=str:match('(%d+)%:?([%a.]*)%:(%d+)$')
print(var1)
print(var2)
print(var3)

向模式添加^是无害的。

更简单的模式是'(.-):(.-):(.-)$’

请注意,在这两种情况下,您都不需要在开头锚定模式,但您需要在结尾处锚定它。