我有一个像
这样的日志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”。 我想按空格分割日志行,但由于字符串,它要困难得多。
我正在努力想出一个能够检测字段和参数的正则表达式,这样我就可以隔离它们并用等号分开。
答案 0 :(得分:2)
您可以使用此正则表达式捕获各种name=value
对:
/(\w+)=(.*?)(?= \w+=|$)/gm
<强>代码:强>
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);
答案 1 :(得分:2)
我建议没有任何前瞻的正则表达式:
var re = /(\w+)=(?:"([^"]*)"|(\S*))/g;
请参阅regex demo
关键是第一组((\w+)
)捕获属性名称,第二组和第三组被放入一个非捕获容器&#34;作为替代分支。可以检查它们的值,然后使用其中任何一个来填充对象。
模式详情:
(\w+)
- 第1组(属性名称)匹配1个字符(来自[a-zA-Z0-9_]
范围)=
- 等号(?:"([^"]*)"|(\S*))
- 一个非捕获&#34;容器&#34;组匹配两种选择中的任何一种:
"([^"]*)"
- 引用,然后第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);
&#13;
答案 2 :(得分:1)
要达到预期效果,请使用以下
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);
答案 3 :(得分:1)