Javascript Regex用键值对分割日志行

时间:2016-08-03 19:17:21

标签: javascript regex

我有一个像

这样的日志
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”。 我想按空格分割日志行,但由于字符串,它要困难得多。

我正在努力想出一个能够检测字段和参数的正则表达式,这样我就可以隔离它们并用等号分开。

4 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式捕获各种name=value对:

/(\w+)=(.*?)(?= \w+=|$)/gm

RegEx Demo

<强>代码:

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 +非空白符号。

&#13;
&#13;
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;
&#13;
&#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);

http://codepen.io/nagasai/pen/oLPRAy

答案 3 :(得分:1)

使用此模式:

/^t=([^ ]+) lvl=([^ ]+) msg=(.*?[a-z]") Service=(.*)$/gm

Online Demo