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

我正试图想出一个正则表达式来检测字段和参数,这样我就可以隔离它们并用等号进行拆分。

我建议使用一个没有任何前瞻性的正则表达式:

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

最新更新