连续多个逗号的Lua string.gmatch模式

时间:2019-03-04 21:18:36

标签: regex lua openresty

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

在此示例中,仅连续使用三个连续逗号的正则表达式是什么?

2 个答案:

答案 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

资源:understanding_lua_patterns