Hinzufügen zu Wackelpudding's Antwort gibt es andere Regex-Varianten, die rekursive Konstrukte unterstützen.
Lua
Utilice %b()
( %b{}
/ %b[]
für geschweifte Klammern / eckige Klammern):
for s in string.gmatch("Extract (a(b)c) and ((d)f(g))", "%b()") do print(s) end
(siehe Demo )
Raku (früher Perl6) :
Nicht überschneidende Übereinstimmungen mit mehreren ausgeglichenen Klammern:
my regex paren_any { '(' ~ ')' [ <-[()]>+ || <&paren_any> ]* }
say "Extract (a(b)c) and ((d)f(g))" ~~ m:g/<&paren_any>/;
# => ((a(b)c) ((d)f(g)))
Überschneidungen mit mehreren ausgeglichenen Klammern:
say "Extract (a(b)c) and ((d)f(g))" ~~ m:ov:g/<&paren_any>/;
# => ((a(b)c) (b) ((d)f(g)) (d) (g))
Ver Demo .
Python re
Nicht-Regex-Lösung
Ver Antwort von Stochern para Wie man einen Ausdruck zwischen ausgeglichenen Klammern erhält .
Mit Java anpassbare Nicht-Regex-Lösung
Hier ist eine anpassbare Lösung, die es erlaubt, einzelne Zeichen als Begrenzungszeichen in Java zu verwenden:
public static List<String> getBalancedSubstrings(String s, Character markStart,
Character markEnd, Boolean includeMarkers)
{
List<String> subTreeList = new ArrayList<String>();
int level = 0;
int lastOpenDelimiter = -1;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == markStart) {
level++;
if (level == 1) {
lastOpenDelimiter = (includeMarkers ? i : i + 1);
}
}
else if (c == markEnd) {
if (level == 1) {
subTreeList.add(s.substring(lastOpenDelimiter, (includeMarkers ? i + 1 : i)));
}
if (level > 0) level--;
}
}
return subTreeList;
}
}
Beispielhafte Verwendung:
String s = "some text(text here(possible text)text(possible text(more text)))end text";
List<String> balanced = getBalancedSubstrings(s, '(', ')', true);
System.out.println("Balanced substrings:\n" + balanced);
// => [(text here(possible text)text(possible text(more text)))]
7 Stimmen
Diese Frage ist sehr schlecht, weil nicht klar ist, worum es geht. Alle Antworten haben sie unterschiedlich interpretiert. @DaveF können Sie bitte die Frage klären?
2 Stimmen
In diesem Beitrag wird geantwortet: stackoverflow.com/questions/6331065/