无法匹配中间的零个或多个模式
Can't match a zero or more pattern in the middle
在正则表达式中,您可以在字符串
中使用正则表达式\d*
"foo 123 bar"
匹配“123”
但是,在 lua 中,当您在同一字符串上使用等效模式 %d*
时,您会得到 nothing。只有当你使用 %s%d*
时,你才会得到正确的匹配。
为什么?
要匹配 Lua regex 中的零个或多个数字,您可以使用表达式 %d+
.
%d
匹配任意数字字符。
+
匹配 1 次或多次重复。
local str = "foo 123 bar"
print(str:match("%d+")) -- Outputs '123'.
首先,我想说这种行为对我来说似乎有点奇怪。但是可以理解为什么Lua中的模式匹配是这样的。至于 %d*
,Lua 尝试从字符串的开头匹配,并匹配了一个零长度的字符串。
local str = "foo 123 bar"
local result = str:match('%d*')
print(type(result), #result)
如你所见,它输出string 0
。不是nil
,所以匹配成功。这就是 Lua 解释您的模式的方式。当涉及到 %s%d*
时,Lua 无法匹配零长度字符串,因此继续 123
。
总而言之,Lua 不会寻找更长的匹配,即使它找到了长度为零的成功匹配。
在正则表达式中,您可以在字符串
中使用正则表达式\d*
"foo 123 bar"
匹配“123”
但是,在 lua 中,当您在同一字符串上使用等效模式 %d*
时,您会得到 nothing。只有当你使用 %s%d*
时,你才会得到正确的匹配。
为什么?
要匹配 Lua regex 中的零个或多个数字,您可以使用表达式 %d+
.
%d
匹配任意数字字符。+
匹配 1 次或多次重复。
local str = "foo 123 bar"
print(str:match("%d+")) -- Outputs '123'.
首先,我想说这种行为对我来说似乎有点奇怪。但是可以理解为什么Lua中的模式匹配是这样的。至于 %d*
,Lua 尝试从字符串的开头匹配,并匹配了一个零长度的字符串。
local str = "foo 123 bar"
local result = str:match('%d*')
print(type(result), #result)
如你所见,它输出string 0
。不是nil
,所以匹配成功。这就是 Lua 解释您的模式的方式。当涉及到 %s%d*
时,Lua 无法匹配零长度字符串,因此继续 123
。
总而言之,Lua 不会寻找更长的匹配,即使它找到了长度为零的成功匹配。