URI包含由三个连续逗号分隔的值。
例如/路径?第一,,,第二,,,第三值,,,第四
我想迭代值并打印单词,如:
first
second
third,value
fourth
此示例仅查找一个逗号,第三个值失败,因为它包含一个逗号。
for word in string.gmatch(ngx.var.request_uri, "[^,]+") do ngx.say(word) end
这也行不通:
for word in string.gmatch(ngx.var.request_uri, "[^,]{3}") do ngx.say(word) end
在此示例中,连续使用三个连续逗号的正确的正则表达式模式是什么?
我相信这会按你的需要运作:
local function process_param(s)
print(s)
end
local path = "/path?first,,,second,,,third,value,,,fourth"
local first = string.match(path, "?([^,]+[,]?[^,]+)")
process_param(first)
for word in string.gmatch(path, ",,,([^,]+[,]?[^,]+)") do
process_param(word)
end
此示例需要单独的步骤来获取first
值,因为它没有领先的,,,
。我使用(
捕获字符串的所需部分,这允许您指定周围的字符而不将它们包含在输出中。我用[,]?
允许一个逗号出现,带有捕获的字符串,允许结果返回third,value
这会产生:
first
second
third,value
fourth
您可以删除所有?
,然后将,,,
替换为不太可能出现在字符串中的字符(例如,\0
,suggested by Egor Skriptunoff),然后使用"[^\0]+"
模式提取所需的项目。
local s = "/path?first,,,second,,,third,value,,,fourth"
s = s:gsub("^[^?]*%?", ""):gsub(",,,", "\0")
for word in string.gmatch(s, "[^\0]+") do print(word) end
输出:
first
second
third,value
fourth
因此,使用gsub("^[^?]*%?", "")
,从字符串开头到第一个?
以及?
的所有文本都被删除,然后gsub(",,,", "\0")
用零字节字符替换,,,
,并且string.gmatch(s, "[^\0]+")
按预期进行多重匹配。
LuaJIT版本
[^\0]
在LuaJIT中无效,因此gmatch
ing应使用%Z+
模式执行,该模式匹配除零字节char之外的一个或多个字符(%z
是根据0
表示documentation的字符)。
查看测试代码段:
> s = "/path?first,,,second,,,third,value,,,fourth"
> s = s:gsub("^[^?]*%?", ""):gsub(",,,", "\0")
> for word in string.gmatch(s, "%Z+") do print(word) end
first
second
third,value
fourth