2017-11-08 1 views
1

Ich suche Lösung, wie Sie Klartext zu der js-Array zu analysieren. Ich habe bereits ein Schema gefunden, in dem ich das machen will, aber irgendwie festgefahren.Parsing Text zu js Array - Trennzeichen zum zweiten Element hinzufügen

Teil Klartext:

2017-11-08 09:43:49,153 [INFO ] root: {\"methodId\":6,\"requestBody\":{},\"token\":\"XXXX\"}2017-11-08 09:53:02,293 [INFO ] root: {\"methodId\":6,\"requestBody\":{},\"token\":\"XXXX\"}2017-11-08 09:53:02,355 [INFO ] root: {\"methodId\":6,\"requestBody\":{},\"token\":\"XXXX\"} 

Erwartetes Ergebnis

const arr = [ 
    '2017-11-08 09:43:49,153 [INFO ] root: {\"methodId\":6,\"requestBody\":{},\"token\":\"XXXX\"}', 
    '2017-11-08 09:53:02,293 [INFO ] root: {\"methodId\":6,\"requestBody\":{},\"token\":\"XXXX\"}', 
    '2017-11-08 09:53:02,355 [INFO ] root: {\"methodId\":6,\"requestBody\":{},\"token\":\"XXXX\"}' 
] 

RegexMuster:

/}\d{4}-\d{2}/ 

Jeder Brocken endet durch Schließen des Objekts "}" und Starten des neuen Datums "YYYY-MM".

Problem

plainText.split(/}\d{4}-\d{2}/) 

Wenn ich es auf diese Weise geteilt, es "frisst" mein Separator immer. Gibt es eine Möglichkeit, Text zu teilen und dem zweiten Element aus dem geteilten Paar ein festgelegtes Trennzeichen hinzuzufügen? Dann könnte ich einfach "}" zum ersten hinzufügen und "}" vom zweiten entfernen. Es ist die Lösung, über die ich nachdenke, aber vielleicht können Sie etwas noch besser vorschlagen.

+0

Woher kommt dieser unordentliche Text überhaupt? – melpomene

+1

's.split (/ \ b (? = \ D {4} - \ d {2} - \ d {2} \ s + [\ d:,] + \ s + \ [INFO] \ s + root :) /). filter (Boolean) '. Kürzen Sie das Muster, wenn die Anforderungen lax sein können (abhängig vom Szenario, kann es sogar '/ \ b (? = \ D {4} - \ d {2} - \ d {2} \ s /' wenn das Datum sein Zeichenfolgen werden nicht in den JSON-Daten angezeigt.) Siehe [diese Demo] (https://regex101.com/r/6ZPbkW/1/) –

+0

@melpomene Antwort von der API, mit der ich arbeite Ich habe keine Kontrolle über die Form, in der es die Antwort bekommt. –

Antwort

1

Wenn die JSON-Daten nicht Datetime-wie Zeichenketten enthalten, können Sie

s.split(/\b(?=\d{4}-\d{2}-\d{2}\s/).filter(Boolean) 

oder eine ausführlichere verwenden (es sicherer zu spielen):

s.split(/\b(?=\d{4}-\d{2}-\d{2}\s+[\d:,]+\s+\[INFO ]\s+root:)/).filter(Boolean) 

Siehe regex demo

Der Punkt ist, die datetime-ähnliche Zeichenkette zu vergleichen, aber sie nicht zu konsumieren, daher wird das gesamte Muster in ein positives Lookahead-Konstrukt von (?=...) eingeschlossen.

Längere Musterdetails

  • \b - eine Wortgrenze
  • (?= - Start des positiven Look-Ahead-Musters
    • \d{4}-\d{2}-\d{2} - Datum artiger Zeichenfolge (4 Ziffern-2 Ziffern-2 Ziffern)
    • \s+ - 1 oder mehr Leerzeichen
    • [\d:,]+ - 1 oder mehr Stellen, : oder/und ,
    • \s+ - 1 oder mehrere Leerzeichen
    • \[INFO ] - ein [INFO ] Teilzeichenfolge
    • \s+ - 1+ Leerzeichen
    • root: - root: Teilzeichenfolge
  • ) - Ende des Lookahead
+1

Vielen Dank! Gelöst! –