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

我需要一个正则表达式来在 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 的正则表达式。

点赞
用户3832970
用户3832970

你需要一个解决方法,其中涉及一个在你的代码中没有使用的临时字符。例如,使用 § 将其插入字母数字和非字母数字字符之后:

str = str:gsub("%s*(%w+)%s*", "%1§") --修剪1个或多个字母数字字符块,并在其后添加临时字符
str = str:gsub("(%W)%s*", "%1§")     --逐个修剪非字母数字字符,并在每个字符后添加临时字符
for token in str:gmatch("[^§]+") do  --匹配除临时字符之外的字符块
    print(token)
end

参见Lua演示

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

2016-06-20 14:59:28
用户1847592
用户1847592
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

本地的 str 变量存储了一段代码,将其作为多行字符串存储。

使用 gmatch 函数将字符串中的标点和单词提取出来并打印。

2016-06-20 16:03:46