如何合并正则表达式提取日志指定前后数据并实现JS批量提取?
日志数据提取:合并正则并生成指定格式列表
问题描述
我有一份包含数据的日志文件,需要提取特定表达式前后的数据。日志示例行如下:
Aug 23 07:25:43 Astrance 125_Heater_1.30.02.0124_d[11421]: 2023-08-23T07:25:43.402421|304|4|1250025|virtual bool CReadTempStep::SPIIsSatisfied():129|Temperatures 39.998318 39.982665 40.167597 40.167027
我需要提取开头的时间戳 Aug 23 07:25:43 和末尾的四个数值 39.998318 39.982665 40.167597 40.167027。目前已用JavaScript写出两个正则:
- 提取时间戳的正则:
.*(?= Astrance.*Temperatures) - 提取四个数值的正则:
(?<= Astrance.*Temperatures).*
需求
如何将这两个正则合并为单个正则实现一次匹配?同时希望得到一个JavaScript程序,将所有匹配结果生成为如下格式的列表:
MatchList = [ [ 'Aug 23 07:25:43', '39.998318 39.982665 40.167597 40.167027' ], [ 'Aug 23 07:25:45', '39.999999 39.576576 40.676767 40.334444' ], [ 'Aug 23 07:25:47', '39.456777 39.734534 40.898899 40.898999' ], ... ]
解决方案
完整代码实现
// 读取本地日志文件到变量 const fs = require("fs"); const logFileString = fs.readFileSync("./sys", "utf-8"); // 使用合并后的正则提取数据并生成指定格式列表 const regex = /^(.*?)\s*Astrance.*Temperatures\s*(.*)/gm; const matches = Array.from([...logFileString.matchAll(regex)], x => [x[1], x[2]]); console.log(matches);
正则说明
合并后的正则 /^(.*?)\s*Astrance.*Temperatures\s*(.*)/gm 各部分作用:
^:匹配行首,确保从每行开头开始匹配(.*?):非贪婪匹配时间戳内容,作为第一个捕获组\s*Astrance.*Temperatures:匹配中间的固定标识及内容,起到分隔作用\s*(.*):匹配Temperatures后的四个数值内容,作为第二个捕获组gm:全局匹配(g)+ 多行模式(m),确保处理日志中的每一行
内容的提问来源于stack exchange,提问作者Marco Moldenhauer
相关产品推荐
相关产品推荐

