使用string.gmatch匹配字符串中的标记的正则表达式

时间:2016-06-20 14:41:25

标签: regex lua

我需要在string.gmatch中使用正则表达式,它将字母数字字符和非字母数字字符(引号,括号,冒号等)的序列与分隔的,单个匹配匹配,基本上是这样的:

str = [[
    function test(arg1, arg2) {
        dosomething(0x12f, "String");
    }
]]

for token in str:gmatch(regex) do
    print(token)
end

应打印:

function
test
(
arg1
,
arg2
)
{
dosomething
(
0x121f
,
"
String
"
)
;
}

我怎样才能做到这一点?在标准正则表达式中,我发现([a-zA-Z0-9]+)|([\{\}\(\)\";,])对我有用,但我不确定如何将其转换为Lua的正则表达式。

2 个答案:

答案 0 :(得分:1)

您需要一个涉及代码中未使用的临时字符的变通方法。例如,使用§将其插入字母数字和非字母数字字符之后:

str = str:gsub("%s*(%w+)%s*", "%1§") -- Trim chunks of 1+ alphanumeric characters and add a temp char after them
str = str:gsub("(%W)%s*", "%1§")     -- Right trim the non-alphanumeric char one by one and add the temp char after each
for token in str:gmatch("[^§]+") do  -- Match chunks of chars other than the temp char
    print(token)
end

请参阅this Lua demo

请注意,Lua中的%w相当于JS [a-zA-Z0-9],因为它与下划线_不匹配。

答案 1 :(得分:1)

local str = [[
    function test(arg1, arg2) {
        dosomething(0x12f, "String");
    }
]]

for p, w in str:gmatch"(%p?)(%w*)" do
   if p ~= "" then print(p) end
   if w ~= "" then print(w) end
end