2016-07-19 20 views
1

Ich muss JSON-Zeichenfolge (die später zum Parsen von JSON verwendet wird) aus einer Protokolldatei extrahieren. Die Datei ist in diesem Format:JavaScript - JSON aus der Protokolldatei extrahieren

[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 

Wie kann ich einen regulären Ausdruck in JavaScript konstruieren, die JSON Daten aus dieser Datei extrahiert werden, so dass es durch string.match verwendet werden kann(), um die gewünschte Ausgabe geben

Das Muster ich versuche ist, wie unten

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

Also, ist das pat tern nicht funktioniert? Beachten Sie, dass '\ s +' "ein oder mehrere Leerzeichen" bedeutet. Das bedeutet, dass Ihr Muster nicht mit Ihrem Beispiel übereinstimmt. Sie haben auch das Ende Ihres Musters,} mehrmals. –

+0

Hier ist ein Muster, das dem angegebenen Format entspricht: https://regex101.com/r/uU9oI0/1 –

+0

Würde der "json" -Datenstring immer in einer separaten Zeile stehen? – RomanPerekhrest

Antwort

1

nicht sicher, ob dies mit regexp funktioniert nur, da Sie das Öffnen und Schließen Klammer zählen müssen. versuchen

dies wird sicherlich komplizierter, wenn es '[' oder ']' in Strings in der JSON sein könnte.

+0

Sie müssen auch öffnende/schließende geschweifte Klammern zählen, falls verschachtelte Objekte vorhanden sind. – Whothehellisthat

2

ich meine Antwort zu aktualisieren, können Sie so etwas versuchen:

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])); 

Fiddle: https://jsfiddle.net/x0cc25q4/7/

UPDATE: Kurzversion mit regex:

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

Fiddle: https://jsfiddle.net/x0cc25q4/8/

+0

Diese Lösung ist in Ordnung, aber ich frage mich, ob es eine Regex-Methode gibt, da dies den Code drastisch reduzieren würde. – Manya

+0

Extrem kurze Version für Sie :) –

+0

Funktioniert wie ein Charme! Danke @Alex K – Manya

Verwandte Themen