URI包含由三个连续的逗号分隔的值。
例如/ path?第一,第二,第三,值,第四
我想对这些值进行迭代,并打印如下字样:
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
在此示例中,仅连续使用三个连续逗号的正则表达式是什么?
答案 0 :(得分:0)
您最多可以删除?
,然后用不太可能出现在字符串中的字符(例如,,,,
,以suggested by Egor Skriptunoff的形式替换\0
),然后使用"[^\0]+"
模式提取所需的项目。
请参见Lua demo online:
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
模式执行%Z+
匹配,该模式匹配除零字节字符({{1 }}是documentation中代表%z
的字符。
查看测试摘要:
0
答案 1 :(得分:-1)
我相信这会根据您的需要进行工作:
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