2016-09-16 5 views
-3

Ich arbeite gerade an einem Parser für mein Programm. Der Parser analysiert Code, der JSON ähnlich ist, möchte aber keinen JSON-Parser verwenden. Es ist zwingend erforderlich, dass ich meinen eigenen Parser und keinen Parser von Drittanbietern verwende. Es verwendet geschweifte Klammern, um "Mengen" einzufügen.Regex, um Text zwischen geschweiften Klammern zu erhalten

Dies ist mein derzeitiger Regex-Code im Moment.

\\{(\\s*)+(.*?)(\\s*)+\\}

Ein Beispiel Ein- und Ausgabe wäre:

Eingang: {value, value2}

Ausgang: value, value2

Nun, dies funktioniert gut, aber wenn ich will in den anderen Satz setzen Eingabe:

Eingabe: {value, {value2}}

Output: value, {value2 }<-Outermost curly bracket

Die äußerste geschweifte Klammer wird zurückgelassenen weil die Schließ geschweifte Klammer aus dem eingebetteten Satz eines Teil des Musters wird.

Ich mag auch in der Lage sein, andere Sätze in dem Eingang zu setzen:

Eingang: {value, value2} {value3, value4}

(Gesucht) Ausgabe: value, value2 value3, value4

Dies macht $ am Ende des Regex mit praktisch nutzlos.

+0

Dieses '{(\ s *) + (. *?) (\ S *) +}' ist ein schlechter Weg, es zu tun. Wenn das Alles-Setzen-Flag gesetzt ist, ist das "\ s" redundant. Wenn das Alles-Punkt-Flag _NOT_ gesetzt ist, wird dieses ". *?" Nur 1 Zeile erlauben, bevor es optionale Leerzeichen erwartet, dann '}'. Irgendwie besiegt den Zweck, es sei denn, du versuchst nur 1 Linie zu entsprechen. – sln

+0

Regex in Java unterstützt keine Rekursion, sodass Sie sie nicht zum Parsen verschachtelter Strukturen verwenden können. – Pshemo

+1

Verwenden Sie die rekursiven Funktionsaufrufe der nativen Java-Sprache, und verwalten Sie Ihre eigenen Klammern. Regex in Java kommt nicht in Frage. Fordern Sie ein Upgrade an. – sln

Antwort

0

Ich fand, dass dies überhaupt nicht möglich ist. Was ich getan habe, war den Startpunkt eines Sets mit Regex zu finden.

Der Eingang wäre so etwas wie:

"@set1{ value1, value2, @set2{ value3, value4}, @set3{ value5, value6}, value7} @set4{ value8, value9 }"

das wäre also sein das Äquivalent zu dieser Skizze:

  • Set 1
    • Wert 1
    • Wert 2
    • Set 2
      • Wert 3
      • Wert 4
    • Set 3
      • Wert 5
      • Wert 6
    • Wert 7
  • Set 4
    • 8 Wert
    • Wert 9

Was habe ich als nächstes durch jedes Zeichen in der Zeichenfolge und gezählt, um die Anzahl der offenen Klammern laufen wurde. Ich stellte dann sicher, dass die Anzahl der geschlossenen Klammern gleich set war.

Ich verwendete eine rekursive Methode, um auch verschachtelte Mengen zu erhalten.

Verwandte Themen