Wenn Sie nur das bekommen müssen, was dazwischen liegt []
, können Sie Folgendes verwenden \[([^\]]*)\]
:
Pattern regex = Pattern.compile("\\[([^\\]]*)\\]");
Matcher m = regex.matcher(str);
if (m.find()) {
result = m.group();
}
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:
[a-zA-Z][a-z-A-Z0-9_]*\s*\[([^\]]*)\]
Dies wird Dinge wie Foo [Bar]
oder myDevice_123["input"]
zum Beispiel validieren .
Hauptproblem
Das Hauptproblem ist, wenn Sie den Inhalt von so etwas extrahieren möchten:
FOO[BAR[CAT[123]]+DOG[FOO]]
Der Regex wird nicht funktionieren und wird zurückkehren BAR[CAT[123
und FOO
.
Wenn wir den Regex in ändern, sind \[(.*)\]
wir in Ordnung, aber wenn Sie versuchen, den Inhalt aus komplexeren Dingen zu extrahieren, wie z.
FOO[BAR[CAT[123]]+DOG[FOO]] = myOtherFoo[BAR[5]]
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:
int i;
int brackets = 0;
string c;
result = "";
for (i = input.indexOf("["); i < str.length; i++) {
c = str.substring(i, i + 1);
if (c == '[') {
brackets++;
} else if (c == ']') {
brackets--;
if (brackets <= 0)
break;
}
result = result + c;
}
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 .