我需要在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的正则表达式。
答案 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
请注意,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