Aus "..A..A..B..B.." inneres 'A' und 'B' entfernen

18/08/2008 - 12:50 von Dirk Clemens | Report spam
Hallo,
ich habe hier die folgende Problemstellung:
Ich habe einen Text mit dem folgenden Aufbau:

"text1 [b] text2 [b] text3 [/b] text4 [/b] text5"

Wie man erkennt ist es eine übliche Foren-Syntax.
[b]..[/b] markiert eine Textstelle. Dieses kann aber nicht
rekursiv eingesetzt werden. Daher suche ich ein Mittel, um
aus dem obigen Text folgendes zu erstellen:

"text1 [b] text2 text3 text4 [/b] text5"

Dabei können diese '[b]' auch mehrfach hintereinander vorkommen.
Daher ist es wichtig, dass

"text1 [b] text2 [/b] text3 [b] text4 [/b] text5 [b] text6 [/b] text7"

unveràndert bleibt.

Ideen?
Ein regexp für sed wàre mir auch lieb.

Zum Testen habe ich hier einen Mustertext und
dahinter die gewünschten Ersetzungen:

(()) aa[b]bb[b]cc[/b]dd[/b]ee
() () aa[b]bb[/b]cc[b]dd[/b]ee
(()) (()) aa[b]bb[b]cc[/b]dd[/b]ee[b]ff[b]gg[/b]hh[/b]ii
() () () () aa[b]bb[/b]cc[b]dd[/b]ee[b]ff[/b]gg[b]hh[/b]ii
() (()) () aa[b]bb[/b]cc[b]dd[b]ee[/b]ff[/b]gg[b]hh[/b]ii
-

(()) aa[b]bbccdd[/b]ee
() () aa[b]bb[/b]cc[b]dd[/b]ee
(()) (()) aa[b]bbccdd[/b]ee[b]ffgghh[/b]ii
() () () () aa[b]bb[/b]cc[b]dd[/b]ee[b]ff[/b]gg[b]hh[/b]ii
() (()) () aa[b]bb[/b]cc[b]ddeeff[/b]gg[b]hh[/b]ii


Meine bisherige (iterative) Lösung:
- Suche '[b]'
- Suche nàchstes '[b]' oder '[/b]':
Falls '[b]': Fundstelle und nàchstes '[/b]' entfernen

Dirk

Mail bitte an: lemmi (minus) usenet (at) ftb (minus) net (dot) de
 

Lesen sie die antworten

#1 Andreas Burmester
19/08/2008 - 14:28 | Warnen spam
Dirk Clemens writes:

Ich habe einen Text mit dem folgenden Aufbau:

"text1 [b] text2 [b] text3 [/b] text4 [/b] text5"

Wie man erkennt ist es eine übliche Foren-Syntax.
[b]..[/b] markiert eine Textstelle. Dieses kann aber nicht
rekursiv eingesetzt werden. Daher suche ich ein Mittel, um
aus dem obigen Text folgendes zu erstellen:

"text1 [b] text2 text3 text4 [/b] text5"

Dabei können diese '[b]' auch mehrfach hintereinander vorkommen.
Daher ist es wichtig, dass

"text1 [b] text2 [/b] text3 [b] text4 [/b] text5 [b] text6 [/b] text7"

unveràndert bleibt.

Ideen?
Ein regexp für sed wàre mir auch lieb.



Die kann es nicht geben, Klammerpàrchen sind nicht regulàr, sondern
kontextfrei.

Zum Testen habe ich hier einen Mustertext und
dahinter die gewünschten Ersetzungen:



[...]

Meine bisherige (iterative) Lösung:
- Suche '[b]'
- Suche nàchstes '[b]' oder '[/b]':
Falls '[b]': Fundstelle und nàchstes '[/b]' entfernen



Wenn ich Dich recht verstanden habe, willst Du alle balanzierte '[b]' /
'[/b]' bis auf die àußersten entfernen.

tiefe = 0
solange nicht alles gelesen:
wenn '[b]' gelesen:
tiefe++
wenn tiefe > 1:
entferne dies '[b]'
sonst, wenn '[/b]' gelesen:
wenn tiefe > 1:
entferne dies '[/b]'
tiefe--
schreibe

b.

Ähnliche fragen