Rekursive RegExps wie?

Status
Nicht offen für weitere Antworten.
T

theomega

Gast
Hallo Leute,
ich würde gerne folgendes machen:
in einem String sollen alle
[xquote]xxx[/xquote] durch etwas anders ersetzt werden. Dabei sollen auch verschachtelte quotes versetzt werden.

Beispiel:
aus
Code:
[xquote]test[xquote]nocheiner[/xquote][/xquote]
soll werden:
Code:
== ZITAT ANFANG==
test
== ZITAT ANFANG==
nocheiner
== ZITAT ENDE ==
== ZITAT ENDE ==

Klar, sowas macht man mit Regular-Expressions, also schnell eine konstruiert und auf einen Teststring angewendet:

Code:
String in = "[quote]test[quote]nocheiner[/quote][/quote]";
Pattern pat = Pattern.compile("\\[quote\\](.*)\\[\\/quote\\]",Pattern.DOTALL);
Matcher mat = pat.matcher(in);
String out = mat.replaceAll("\n===== ZITAT ANFANG ==== \n $1 \n ===== ZITAT ENDE ===== \n");
System.out.println(out);

Sollte eigentlich genau das was oben steht produzieren. Tut es aber nicht, es wird nur ein Zitat ersetzt, das zweite bleibt unverändert stehen.
Code:
===== ZITAT ANFANG ==== 
 test[quote]nocheiner[/quote] 
 ===== ZITAT ENDE =====

Das ist nicht das was ich will, der soll doch bitte das ganze sooft anwenden bis es nichtmehr anders geht, so wie es zum Beispiel PHP auch tut. Wie bringe ich ihm das bei? Wenn ich den Matcher nochmal auf das Ergebniss vom ersten Durchlauf loslasse dann habe ich das richtige Ergebniss, nur ist das natürlich keine Lösung!

Wer hat mir einen Tipp?

Danke
TO
 

André Uhres

Top Contributor
Code:
       in = in.replaceAll("\\[quote\\]", "\n===== ZITAT ANFANG ==== \n").
                replaceAll("\\[/quote\\]", "\n===== ZITAT ENDE ==== \n");
 
T

theomega

Gast
Hy,
leider keine Akzeptable Lösung: Meine Vorgehensweise oben war nur ein Beispiel, eigentlich wird das nacher durch HTML-Code ersetzt. Dieser startet mit einem "<div>" und endet mit einem "</div>". Mit deiner Lösung könnte man einfach nur [/xquote] in den Text schreiben und könnte so das ganze Design zerströren.

Es muss doch eine andere Lösung geben!

Danke
TO
 
T

theomega

Gast
Hallo,
ein Parser für BB-Code für eine kleine Software. Es soll den Benutzern ermöglicht werden Kommentare für eine Art Blog zu schreiben. Dabei soll es auch möglich sein mit der oben genannten Lösung vorherige Beiträge zu zitieren. Und das kann natürlich mehrmals passieren, damit würden die Tags verschachtelt werden.

Gruß und Danke
TO
 

foobar

Top Contributor
Schreib dir eine rekursive Methode die einenString entgegennimmt und nach [xquote](.*)[/xquote] sucht. Dann findest du immer das äusserste Klammerpaar. Das Ergebnis aus dieser Suche übergibst du wieder an deine Methode bis du keinen Treffer mehr hast.
 

SebiB90

Top Contributor
ich weiß nicht wie der regex dazu aussieht aber es müsste gehen wenn du nach
Code:
[quote] (irgendein text wo kein [quote] vorkommt) [/quote]
suchst. das müsste er immer erst die inneren ersetzen bevor er die äußeren ersetzt.
 
T

theomega

Gast
Hy,
eure Lösungen foobar und SebiB90 sind ok, aber eine rekursive Lösung meinerseits kostet halt extrem viel Rechenzeit. Gibt es keine bessere Löung? PHP macht das ja automatisch, die rekursive Anwendung.

Danke euch
TO
 
B

bygones

Gast
theomega hat gesagt.:
Hy,
eure Lösungen foobar und SebiB90 sind ok, aber eine rekursive Lösung meinerseits kostet halt extrem viel Rechenzeit. Gibt es keine bessere Löung? PHP macht das ja automatisch, die rekursive Anwendung.

Danke euch
TO
php macht das nicht automatisch - irgendjemand hat das so programmiert ;-) scheinbar sind beides rekursive lösungen - sehe also nicht das problem darin
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben