我有一个类似的日志
t=2016-08-03T18:47:26+0000 lvl=dbug msg="Event Received" Service=SomeService
我想把它变成一个类似的javascript对象
{
t: 2016-08-03T18:47:26+0000,
lvl: dbug
msg: "Event Received"
Service: SomeService
}
但是,我在生成一个正则表达式时遇到了问题,该正则表达式将检测日志行中的字符串"Event Received"。我想按空格分隔日志行,但由于字符串的原因,这要困难得多。
我正试图想出一个正则表达式来检测字段和参数,这样我就可以隔离它们并用等号进行拆分。
我建议使用一个没有任何前瞻性的正则表达式:
var re = /(w+)=(?:"([^"]*)"|(S*))/g;
查看regex演示
关键是,第一组((w+)
)捕获属性名称,第二组和第三组被放置在一个不捕获的"容器"中作为备用分支。可以检查它们的值,然后使用其中一个来填充对象。
图案详细信息:
(w+)
-组1(属性名称)匹配1个以上单词字符(来自[a-zA-Z0-9_]
范围)=
-等号(?:"([^"]*)"|(S*))
-一个非捕获"容器"组,匹配两个备选方案中的任何一个:"([^"]*)"
-一个引号,然后第2组捕获除"
之外的0+个字符,以及一个引号|
-或(S*)
-第3组捕获0+个非空白符号
var rx = /(w+)=(?:"([^"]*)"|(S*))/g;
var s = "t=2016-08-03T18:47:26+0000 lvl=dbug msg="Event Received" Service=SomeService";
var obj = {};
while((m=rx.exec(s))!==null) {
if (m[2]) {
obj[m[1]] = m[2];
} else {
obj[m[1]] = m[3];
}
}
console.log(obj);
您可以使用此正则表达式捕获各种name=value
对:
/(w+)=(.*?)(?= w+=|$)/gm
RegEx演示
代码:
var re = /(w+)=(.*?)(?= w+=|$)/gm;
var str = 't=2016-08-03T18:47:26+0000 lvl=dbug msg="Event Received" Service=SomeService';
var m;
var result = {};
while ((m = re.exec(str)) !== null) {
if (m.index === re.lastIndex)
re.lastIndex++;
result[m[1]] = m[2];
}
console.log(result);
使用此模式:
/^t=([^ ]+) lvl=([^ ]+) msg=(.*?[a-z]") Service=(.*)$/gm
在线演示
要实现预期结果,请使用以下
var x = 't=2016-08-03T18:47:26+0000 lvl=dbug msg="Event Received" Service=SomeService';
var y = x.replace(/=/g,':').split(' ');
var z = '{'+ y+'}';
console.log(z);
http://codepen.io/nagasai/pen/oLPRAy