正则表达式在Lua的gmatch函数中无法正常工作。

例如,我们有一个字符串

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

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

var1 = "12345"   -- 必需的
var2 = "some.address.ru"  -- 可以为 nil
var3 = "1234"   -- 可以为 nil

我写了这样的代码:

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

但是我没有收到任何结果。如果我在模式的开头删除符号 ^,它就能工作得很好。 出了什么问题?为什么它不能使用符号 ^,我该如何解决? (我需要检查这个模式是否从字符串的开头开始)

有没有可能不使用 for 循环来实现这个目标? (我的字符串不包含多个模式)

谢谢。

点赞
用户107090
用户107090

手册关于 gmatch 的描述如下:

在模式的开头使用小写字母 '^' 不起作用,因为这会阻止迭代。

你不需要循环,也不需要 gmatch。直接使用以下代码

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

将 '^' 加入模式是无害的。

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

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

2014-01-19 20:46:26