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

问题描述 投票:1回答:2

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

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

regex lua openresty
2个回答
-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


0
投票

您可以删除所有?,然后将,,,替换为不太可能出现在字符串中的字符(例如,\0suggested by Egor Skriptunoff),然后使用"[^\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中无效,因此gmatching应使用%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
© www.soinside.com 2019 - 2024. All rights reserved.