Wenn Sie einfach brauchen, um alles, was zwischen []
ist, kann die Sie \[([^\]]*)\]
wie folgt verwenden:
Pattern regex = Pattern.compile("\\[([^\\]]*)\\]");
Matcher m = regex.matcher(str);
if (m.find()) {
result = m.group();
}
Wenn Sie es brauchen die Form zu sein, Sie identifier + [ + content + ]
dann kann das Extrahieren des Inhalts nur einschränken, wenn der Bezeichner ein alphanumerischer Wert ist:
Dies wird gültig Dinge wie Foo [Bar]
oder myDevice_123["input"]
zum Beispiel.
Haupt Ausgabe
Das Hauptproblem ist, wenn Sie den Inhalt, so etwas entpacken:
FOO[BAR[CAT[123]]+DOG[FOO]]
Die Regex wird nicht funktionieren und wird BAR[CAT[123
und FOO
zurück.
Wenn wir die Regex zu \[(.*)\]
ändern dann sind wir in Ordnung, aber dann, wenn Sie versuchen, den Inhalt von komplexeren Dingen zu extrahieren wie:
FOO[BAR[CAT[123]]+DOG[FOO]] = myOtherFoo[BAR[5]]
Keine des Regexes funktionieren wird.
Die genaueste Regex, um den richtigen Inhalt in allen Fällen zu extrahieren, wäre sehr viel komplexer, da es []
Paare ausgleichen müsste und Ihnen Inhalt geben würde.
Eine einfachere Lösung
Wenn Ihre Probleme sind komplex und der Inhalt des willkürlichen []
bekommen, könnte man stattdessen die Paare von []
balancieren und die Zeichenfolge mit einfachen altem Code Rathe als ein Regex extrahieren:
Dies ist mehr Pseudo-Code als realer Code, ich bin kein Java-Coder, also weiß ich nicht, ob die Syntax korrekt ist, aber es sollte leicht genug sein, um zu verbessern.
Was zählt ist, dass dieser Code funktionieren sollte und Sie den Inhalt des []
extrahieren können, wie komplex es auch ist.
Es ist erwähnenswert, dass, wenn es eine neue Zeile zwischen den eckigen Klammern gibt, wird dies fehlschlagen und Sie sollten das Pattern.DOTALL Flag verwenden, um dies zu vermeiden. – cletus
Wie würden Sie dann das obige Muster verwenden, um die Zeichenfolge mit der Zeichenfolge BAR zu extrahieren? Ich schaue mir die Pattern-API und die Matcher-API an, bin mir aber immer noch nicht sicher, wie ich die Zeichenfolge selbst erhalten soll. – digiarnie
@cletus: Guter Anruf! @digiarnie: Ich habe eine Antwort zu der Antwort hinzugefügt, die einen Strohmann-Code enthält, um das Spiel zu bekommen. –