2016-07-19 109 views
1

我需要提取JSON字符串(稍後將用於解析JSON)從日誌文件中提取JSON。該文件的格式如下:JavaScript的 - 從日誌文件

[16:11:20] some text 
[16:11:20] some text 
some text 
some text 
[ 
    { 
    "description": "some text", 
    "elements": [{ 
     "id": "some text", 
     "keyword": "some text", 
     "line": 20, 
     "name": "some text", 
     "steps": [{ 
      "arguments": [], 
      "keyword": "some text ", 
      "result": { 
       "status": "passed", 
       "duration": 14884761888 
      }, 
      "hidden": true, 
      "match": { 
       "location": "some text" 
      } 
     }, 
     { 
      "arguments": [], 
      "keyword": "sometext ", 
      "name": "sometext", 
      "result": { 
       "status": "passed", 
       "duration": 463674 
      }, 
      "line": 11, 
      "match": { 
       "location": "sometext" 
      } 
     } 
     ], 
     "tags": [ 
      { 
      "name": "@sometext-no", 
      "line": 7 
      }, 
      { 
      "name": "@sometext", 
      "line": 8 
      } 
     ], 
     "type": "sometext" 
     } 

    ], 
    "id": "sometext", 
    "keyword": "sometext", 
    "line": 1, 
    "name": "sometext", 
    "tags": [], 
    "uri": "sometext" 
    } 
][16:11:54] some text 
[16:11:54] some text 

如何可以構造一個正則表達式在JavaScript其中將從該文件中提取JSON數據,以便它可以通過string.match被使用(),以得到所需的輸出

我嘗試的模式是如下

var regExtract = /(\[\s+\{[\s\S]*\}\s+\]\s+\}\s+\]\s+\}\s+\])/; 
var matchedJson = data.toString().match(regExtract)[1]; 
+0

那麼,那個pat燕鷗不工作?請注意'\ s +'意思是「一個或多個空白字符」,所以這意味着你的模式不符合你的例子。你也可以結束你的模式,'}]'幾次。 –

+0

這裏有一個其提供的格式相匹配行話:https://regex101.com/r/uU9oI0/1 –

+0

會說:「JSON」數據串始終放置在單獨的行? – RomanPerekhrest

回答

1

不知道這工作與正則表達式只因爲你需要計算開啓和關閉括號。嘗試

var start=string.indexOf('[{'); 
var level=1; 
start++; 
while (level>0){ 
    if (string[start]==='[') level++; 
    if (string[start]===']') level--; 
    start++; 
} 

這無疑變得更爲複雜,如果有可能在JSON字符串中「[」或「]」。

+0

還需要計數打開/關閉大括號,如果存在嵌套對象樣品日誌文件中的適量。 – Whothehellisthat

2

更新我的答案,你可以嘗試這樣的事情:

var str = `[16:11:20] some text 
[16:11:20] some text 
some text 
some text 
[ 
    { 
    "description": "some text", 
    "elements": [{ 
     "id": "some text", 
     "keyword": "some text", 
     "line": 20, 
     "name": "some text", 
     "steps": [{ 
      "arguments": [], 
      "keyword": "some text ", 
      "result": { 
       "status": "passed", 
       "duration": 14884761888 
      }, 
      "hidden": true, 
      "match": { 
       "location": "some text" 
      } 
     }, 
     { 
      "arguments": [], 
      "keyword": "sometext ", 
      "name": "sometext", 
      "result": { 
       "status": "passed", 
       "duration": 463674 
      }, 
      "line": 11, 
      "match": { 
       "location": "sometext" 
      } 
     } 
     ], 
     "tags": [ 
      { 
      "name": "@sometext-no", 
      "line": 7 
      }, 
      { 
      "name": "@sometext", 
      "line": 8 
      } 
     ], 
     "type": "sometext" 
     } 

    ], 
    "id": "sometext", 
    "keyword": "sometext", 
    "line": 1, 
    "name": "sometext", 
    "tags": [], 
    "uri": "sometext" 
    } 
][16:11:54] some text 
[16:11:54] some text 
`; 

var json = ''; 
var jsonArray = []; 
var implode = false; 
str.split('\n').forEach(function(v, k){ 
    if(v === ' {'){ 
    console.log(k, v); 
    implode = true; 
    } 

    if(implode){ 
    json = json + v + '\n'; 
    } 

    if(v === ' }'){  
    console.log(k, v); 
    implode = false; 
    jsonArray.push(json.trim()); 
    json = ''; 

    console.log(jsonArray);  
    } 
}); 
console.log(JSON.parse(jsonArray[0])); 

小提琴:https://jsfiddle.net/x0cc25q4/7/

UPDATE:短版用正則表達式:

var arr = str.split('\n').join('').match(/\[\s{2}(\{.*?\})\]/g); 
console.log(JSON.parse(arr[0])); 

小提琴:https://jsfiddle.net/x0cc25q4/8/

+0

該解決方案是不錯,但我不知道是否有這樣做,因爲這將大大降低代碼的任何正則表達式的方法。 – Manya

+0

非常短的版本:) –

+0

工程就像一個魅力!謝謝@Alex K – Manya