我有两个(或更多)不同的出口从我们的系统的原始数据。我想通过使用正则表达式来区分它,而不使用IF foreach。
Bellow有两个例子:
在第一个日志中,我只需要获得消息。但在另一种情况下,我需要获得对象、类型、客户端IP、状态、消息。
我希望我需要使用?在regex中,但是我不知道如何不对每一种情况使用IF。
谢谢你的帮助。
发布于 2022-05-01 09:26:08
如果我对你的理解是正确的,你有上面的条目作为字符串。
只有一个正则表达式,就很难做到这一点。就我个人而言,我更喜欢正则表达式和split()的混合,并尝试首先从它中生成一个正则对象。
类似于:
var entriesRaw = [
'<14>Apr 29 10:00:00 nimble1-A NMBL: Array:nimblegroup Type:14883 Time:Fri Apr 29 10:00:00 2022#012 Id:8234 Target:nimble2-nimble1 Version:6.0.0.300-956221-opt Message:Successfully created a snapshot of the volumes associated with volume collection nimble2-nimble1 schedule test on synchronous replication partners pool-nimble2 and pool-nimble1.',
'<14>May 1 00:53:01 nimble1-A NMBL: Group:nimblegroup Type:1016 Time:Sun May 1 00:53:01 2022#012 Id:9106 Object Id:- Object: Access Type:su Client IP:Console Status:Succeeded Version:6.0.0.300-956221-opt Message:Elevating user privilege to admin'
];
var entries = entriesRaw.map(function(entry) {
return entry.split(/((?:Array|Client IP|Group|Id|Message|Object(?: Id)?|Status|Target|Time|Type|Version):)/g).reduce((acc, chunk, i, chunks) => {
if(chunk.slice(-1) === ':' && i < chunks.length - 1) {
var tmp = {};
tmp[chunk.slice(0, -1)] = chunks[i + 1].trim();
return Object.assign({}, acc, tmp);
}
return acc;
}, {});
});
console.log(entries);这样,您就可以将所有条目解析为具有键值对的对象数组,并且可以访问它们。
诀窍是在split()内部进行回溯,因为这样分割的块是结果数组的一部分。
条目的问题是,它们的语法很难解析,所以必须在正则表达式中将每个键作为文字字符串。
如果你需要额外的帮助,你可以随便问。:-)
https://stackoverflow.com/questions/72074836
复制相似问题