例如我们有一个字符串
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个模式)
由于
答案 0 :(得分:4)
manual说明gmatch
:
模式开头的插入符'^'不能用作锚点,因为这会阻止迭代。
您不需要循环,因此不需要gmatch
。只是做
var1, var2, var3=str:match('(%d+)%:?([%a.]*)%:(%d+)$')
print(var1)
print(var2)
print(var3)
向模式添加^
是无害的。
更简单的模式是'(.-):(.-):(.-)$’
。
请注意,在这两种情况下,您都不需要在开头锚定模式,但您需要在结尾处锚定它。