基本字符串是:IP: 192.168.0.1
将该字符串传递给 string.gmatch 函数(除了下面的模式)将返回以下结果:
模式:IP: (%d+.%d+.%d+.%d+)
-->192.168.0.1
模式:IP: %d+.%d+.%d+.%d+
-->IP:192.168.0.1
我的问题是,这些括号对 Lua 模式匹配引擎的含义是什么?为什么通过在第一个模式中使用括号,IP:
省略了字符串但在第二个模式中没有?
基本字符串是:IP: 192.168.0.1
将该字符串传递给 string.gmatch 函数(除了下面的模式)将返回以下结果:
模式:IP: (%d+.%d+.%d+.%d+)
-->192.168.0.1
模式:IP: %d+.%d+.%d+.%d+
-->IP:192.168.0.1
我的问题是,这些括号对 Lua 模式匹配引擎的含义是什么?为什么通过在第一个模式中使用括号,IP:
省略了字符串但在第二个模式中没有?
括号内的任何内容都是捕获组;与括号中的模式部分匹配的输入字符串的任何部分都由match()
and捕获并返回gmatch()
。如果模式中没有捕获组,则返回整个字符串。
local x, y, z = ("123456"):match("(%d)%d(%d)%d(%d)%d")
print(x, y, z)
-- 1, 3, 5
在指定关联的捕获组之后的任何时候%1
,%2
等都可以用于访问捕获的值:
local x, y = ("123123123"):match("(%d%d%d)%1(%1)")
print(x, y)
-- 123, 123
这在 的第三个参数中最常见string.gsub()
,但可以在任何模式匹配函数中使用。
在这种情况下,它应该只用于对事物进行分组,这在这里都无关紧要。