Lua 5.4.2中改造getmatches函数实现动态传递匹配模式
解决方案
改造要点
- 给
getmatches函数新增pattern_string参数,实现动态匹配 - 转义Lua模式中的特殊元字符(如
.,*,+等),避免匹配逻辑出错 - 修正捕获值的输出,确保获取的是第二列内容
改造后的完整代码
-- 转义Lua模式中的特殊元字符 local function escape_pattern(str) return str:gsub("([%%%^%$%(%)%.%[%]%*%+%-%?])", "%%%1") end function getmatches(text, pattern_string) -- 转义后构造匹配模式:匹配指定前缀,跳过到逗号,捕获第二列内容 local pattern = escape_pattern(pattern_string) .. "[^,]*,([^,]+)" for line in string.gmatch(text, "[^\r\n]+") do -- 这里捕获的第一个值就是第二列内容 local col2 = string.match(line, pattern) if col2 ~= nil then print(col2) end end end local open = io.open local function read_file(path) local file = open(path, "rb") -- 二进制模式读取避免换行符问题 if not file then return nil end local content = file:read "*a" -- 读取整个文件内容 file:close() return content end -- 示例调用:传入要匹配的前缀字符串 local fileContent = read_file("Datos2.txt") if fileContent then getmatches(fileContent, "Data11") -- 这里可以动态替换成任意需要匹配的字符串 else print("无法读取文件") end
关键说明
- 转义函数
escape_pattern:如果你的匹配字符串包含Lua模式的特殊字符(比如Data.11中的.),不转义的话会被当作"匹配任意字符"处理,导致匹配错误。这个函数会把所有特殊字符转义,确保按字面匹配。 - 匹配模式构造:
escape_pattern(pattern_string) .. "[^,]*,([^,]+)"的逻辑是:- 先匹配传入的前缀字符串(已转义)
[^,]*匹配前缀到逗号之间的所有非逗号字符(包括空),匹配分隔逗号([^,]+)捕获逗号之后的所有非逗号字符,也就是第二列内容
- 修正捕获值:原代码中错误地输出了匹配的前缀,改造后直接捕获并输出第二列内容,符合需求。
- 错误处理:新增了文件读取失败的提示,增强代码健壮性。
内容的提问来源于stack exchange,提问作者kehrrt Krohnt
相关产品推荐
相关产品推荐

