如何解析含空格键名的Windows事件消息键值对并适配多格式?
解决WinCollect Windows事件消息的键值对解析问题
问题明确
需要处理两类WinCollect采集的Windows事件消息格式,同时满足核心解析需求:
格式1(值不含等号):
Security ID: S-1-5-21-xxx
Logon ID: 0x12345
Empty Key:
格式2(值含等号):
Time Created: 2024-05-20T12:30:00.000Z=UTC
Custom Field: Value=With=Multiple=Equals
核心要求:
- 含空格的键名转PascalCase(如
Security ID→SecurityId) - 兼容空值、等号前后空格的场景
- 完整捕获值中包含等号的内容
改进的JavaScript解析方案
通过正向预查+非贪婪匹配的正则逻辑,同时配合键名转换、值清洗的处理逻辑,实现两类格式的兼容解析。
完整代码实现
function parseWinCollectEvent(message) { // 正则匹配规则:捕获键名 + 冒号+空格 + 值(直到下一个标准键名行或文本结尾) const regex = /([A-Za-z\s]+):\s*(.*?)(?=\n[A-Z][a-z]+\s[A-Z]|$)/gs; const result = {}; let match; while ((match = regex.exec(message)) !== null) { const rawKey = match[1].trim(); const rawValue = match[2].trim(); // 键名转PascalCase:去空格,各单词首字母大写 const pascalCaseKey = rawKey.split(' ') .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) .join(''); // 空值处理:将空字符串转为null(可按需改为空字符串) const value = rawValue === '' ? null : rawValue; result[pascalCaseKey] = value; } return result; }
关键逻辑说明
- 正则核心:
([A-Za-z\s]+):捕获含空格的键名:\s*:匹配冒号及后续任意空格(.*?):非贪婪捕获值,避免截断含等号的内容(?=\n[A-Z][a-z]+\s[A-Z]|$):正向预查确保值结束于**新的标准键名行(如Security ID这类大写开头+空格+大写的格式)**或文本末尾,完整保留值中的等号
- PascalCase转换:拆分空格后的单词,统一首字母大写其余小写,拼接成无空格键名
- 值清洗:自动去除值前后的多余空格,空值转为
null(可根据业务需求调整)
测试验证
测试格式1+空值场景
const msg1 = `Security ID: S-1-5-21-xxx Logon ID: 0x12345 Empty Key: `; console.log(parseWinCollectEvent(msg1)); // 输出: // { // SecurityId: 'S-1-5-21-xxx', // LogonId: '0x12345', // EmptyKey: null // }
测试格式2(值含等号)场景
const msg2 = `Time Created: 2024-05-20T12:30:00.000Z=UTC Custom Field: Value=With=Multiple=Equals `; console.log(parseWinCollectEvent(msg2)); // 输出: // { // TimeCreated: '2024-05-20T12:30:00.000Z=UTC', // CustomField: 'Value=With=Multiple=Equals' // }
边界兼容处理
- 键名含多个连续空格:自动trim后正常转换为PascalCase
- 值前后含大量空格:自动trim去除冗余
- 单一行键值对:单独一行的消息也能正确解析
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

