Wenn ich eine Zeichenfolge wie diese habe:
FOO[BAR]
Ich brauche eine generische Methode, um die Zeichenfolge "BAR" aus der Zeichenfolge herauszuholen, damit die Zeichenfolge unabhängig von der Zeichenfolge in den eckigen Klammern abgerufen werden kann.
z.B
FOO[DOG] = DOG
FOO[CAT] = CAT
der nicht-reguläre Weg:
alternativ für etwas bessere Leistung / Speichernutzung (danke Hosam):
quelle
lastIndexOf(']')
stattdessen verwenden, was verschachtelte Klammern behandeln würde. Darüber hinaus glaube ich, dass die Verwendung derindexOf(char)
schneller wäre alsindexOf(String)
.lastIndexOf
das Schließen der schließenden Klammer sicherlich schneller sein wird.Dies ist ein funktionierendes Beispiel:
RegexpExample.java
Es zeigt an :
quelle
quelle
Wenn Sie nur das bekommen müssen, was dazwischen liegt
[]
, können Sie Folgendes verwenden\[([^\]]*)\]
:Wenn es die Form haben soll
identifier + [ + content + ]
, können Sie das Extrahieren des Inhalts nur einschränken, wenn der Bezeichner eine alphanumerische Zahl ist:Dies wird Dinge wie
Foo [Bar]
odermyDevice_123["input"]
zum Beispiel validieren .Hauptproblem
Das Hauptproblem ist, wenn Sie den Inhalt von so etwas extrahieren möchten:
Der Regex wird nicht funktionieren und wird zurückkehren
BAR[CAT[123
undFOO
.Wenn wir den Regex in ändern, sind
\[(.*)\]
wir in Ordnung, aber wenn Sie versuchen, den Inhalt aus komplexeren Dingen zu extrahieren, wie z.Keiner der Regexes funktioniert.
Der genaueste Regex, um in allen Fällen den richtigen Inhalt zu extrahieren, wäre viel komplexer, da er
[]
Paare ausgleichen und ihnen den Inhalt geben müsste .Eine einfachere Lösung
Wenn Ihre Probleme komplex werden und der Inhalt
[]
beliebig ist, können Sie stattdessen die Paare von ausgleichen[]
und die Zeichenfolge mit einem einfachen alten Code als einem Regex extrahieren:Dies ist mehr Pseudocode als echter Code. Ich bin kein Java-Codierer, daher weiß ich nicht, ob die Syntax korrekt ist, aber es sollte leicht genug sein, sie zu verbessern.
Was zählt ist, dass dieser Code funktionieren sollte und es Ihnen ermöglichen sollte, den Inhalt des noch
[]
so komplexen Codes zu extrahieren .quelle
Ich denke, Ihr regulärer Ausdruck würde so aussehen:
Angenommen, FOO wird konstant sein.
Um dies in Java zu formulieren:
quelle
Dies gibt den Wert zwischen dem ersten '[' und dem letzten ']' zurück.
Foo [Bar] => Bar
Foo [Bar [Test]] => Bar [Test]
Hinweis: Sie sollten eine Fehlerprüfung hinzufügen, wenn die Eingabezeichenfolge nicht richtig geformt ist.
quelle
unter der Annahme, dass in / FOO \ [([^ \]] *) \] / keine andere schließende eckige Klammer zulässig ist
quelle
Ich würde definieren, dass ich eine maximale Anzahl von Nicht-] Zeichen zwischen
[
und möchte]
. Diese müssen mit Backslashes maskiert werden (und in Java müssen diese erneut maskiert werden), und die Definition von non-] ist eine Zeichenklasse, also innerhalb[
und]
(dh[^\\]]
). Das Ergebnis:quelle
So funktioniert es, wenn Sie einen String analysieren möchten, der von mYearInDB.toString () = [2013] stammt. Er gibt 2013
quelle
Dieser reguläre Ausdruck funktioniert für mich:
Beispiel:
Ausgabe:
Getestet auf http://rubular.com/
quelle
Dies gibt eine Zeichenfolge zurück, die nur die Zeichenfolge in eckigen Klammern verwendet.
Dadurch werden alle Zeichenfolgen außerhalb der eckigen Klammern entfernt.
Sie können diesen Java-Beispielcode online testen: http://tpcg.io/wZoFu0
Sie können diesen regulären Ausdruck hier testen: https://regex101.com/r/oUAzsS/1
quelle