You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键说明

  1. 转义函数escape_pattern:如果你的匹配字符串包含Lua模式的特殊字符(比如Data.11中的.),不转义的话会被当作"匹配任意字符"处理,导致匹配错误。这个函数会把所有特殊字符转义,确保按字面匹配。
  2. 匹配模式构造:escape_pattern(pattern_string) .. "[^,]*,([^,]+)"的逻辑是:
    • 先匹配传入的前缀字符串(已转义)
    • [^,]*匹配前缀到逗号之间的所有非逗号字符(包括空)
    • ,匹配分隔逗号
    • ([^,]+)捕获逗号之后的所有非逗号字符,也就是第二列内容
  3. 修正捕获值:原代码中错误地输出了匹配的前缀,改造后直接捕获并输出第二列内容,符合需求。
  4. 错误处理:新增了文件读取失败的提示,增强代码健壮性。

内容的提问来源于stack exchange,提问作者kehrrt Krohnt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 03:40:23