Forum: PC-Programmierung [C++] Boost Library


von Andreas W. (avedo)


Lesenswert?

Guten Abend!

Ich beschäftige mich gerade mit dem Einsatz von Regex unter Verwendung 
der Boost Bibliothek. Leider bin ich dabei auf ein kleines Problem 
gestoßen. Im Allgemeinen funktioniert das Ersetzen zwar, jedoch möchte 
ich nun BBCodes mit der Funktion regex_replace() durch Latex-Code 
ersetzen. Versucht habe ich die mit folgendem Code:
1
buffer = boost::regex_replace(
2
  buffer, 
3
  boost::regex("\\[tag\\](.*)\\[\\/tag\\]"), 
4
  string("\\href{$1}{$1}")
5
);

Leider funktioniert dies nicht. Ebenso gelingt mir nicht die Ersetzung 
des BBCodes [tag=http://www.example.de]Linktest[/tag]. Was mache ich 
falsch?

Wpürde mich über Hilfe freuen.

Liebe Grüße,

Andreas

von sebastians (Gast)


Lesenswert?

Ist .* zu "greedy"?

von Andreas W. (avedo)


Lesenswert?

Könnte schon sein. Wie könnte ich es denn besser machen. Ich habe leider 
nicht wirklich viel Ahnung von Regechsen.

Liebe Grüße,

Andreas

von Rolf Magnus (Gast)


Lesenswert?

Statt .* vielleicht mit [^\[]* damit das nur bis zum "[tag]" matcht.

von Andreas W. (avedo)


Lesenswert?

Vielen vielen Dank! Das funktioniert hervorragend. Wie soll ich es 
jedoch machen, wenn ich ein Tag ala [tag=source]Beschreibung[/tag] 
matchen möchte.

Liebe Grüße,

Andreas

von Yalu X. (yalu) (Moderator)


Lesenswert?

Es gibt auch "non greedy Repeats", einfach .* durch .*? ersetzen. Damit
werden viele Regexe einfacher, weil man sich nicht mit fehleranfälligen
[^...]-Konstruktionen herumschlagen muss.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

BBCodes sind nicht geeignet ausschließlich über eine RegExp "geparst" zu 
werden, da kommt nur Mist raus im Zweifel.
Ansonsten musst du für die beiden Fälle (mit Parameter/ohne)eben Zwei 
ausdrücke formulieren.

von Andreas W. (avedo)


Lesenswert?

Da es sich nur um die Ersetzung einiger wenige BBCodes handelt, können 
ruhig mehrere Ausdrücke formuliert werden. Diese werden jedoch alle ein 
ähnliches Schema verwenden. Ich weiß jedoch nicht, wie ein solcher 
AUsdrück für die Form [tag=source]Beschreibung[/tag] beispielsweise für 
ein URL-Tag aussehen müsste.

Liebe Grüße,

Andreas

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

1
  $bericht = eregi_replace("\\[color=([^\\[]*)\\]([^\\[]*)\\[/color\\]","<font color=\"\\1\">\\2</font>",$bericht);
Hier mal ein Beispiel...

von Andreas W. (avedo)


Lesenswert?

Schönes PHP Beispiel. Danke. Allerdings habe ich nun noch ein letztes 
Problem. Ich möchte nun folgende Ersetzung durchführen.
1
buffer = boost::regex_replace(
2
  buffer, 
3
  boost::regex("\\[img\\]([^\\[]*)\\[\\/img\\]"), 
4
  "\\href{$1}{$1}"
5
);

Leider wird kein Backslash vor "href" ausgegeben, obwohl dieser extra 
escaped wurde. Woran kann das liegen?

Liebe Grüße,

Andreas

von Klaus W. (mfgkw)


Lesenswert?

Vermutung: im Ausdruck muß er escaped werden (also \\ drinstehen),
für C muß jeder der beiden ebenfalls als \\ geschrieben werden.
Macht summa summarum \\\\

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Klaus Wachtler schrieb:
> Vermutung: im Ausdruck muß er escaped werden (also \\ drinstehen),
> für C muß jeder der beiden ebenfalls als \\ geschrieben werden.
> Macht summa summarum \\\\
So ist es... Ein Grund warum Reguläre Ausdrücke schnell unleserlich 
werden und man nacher überhauptnichtmehr durchsteigt ;)

von Klaus W. (mfgkw)


Lesenswert?

Man muß es positiv sehen:
Sowas hält fit bis ins hohe Alter!

von Andreas W. (avedo)


Lesenswert?

Morgen!

Vielen Dank für eure Hilfe. Habe es nun zum Laufen bekommen. Die Aufgabe 
dieses kleinen Programms soll nur sein ein paar BBCodes und 
Sonderzeichen in einem Tutorial durch die entsprechenden Latex-Codes zu 
ersetzen, sodass ich nur einen Header und Footer hinzufügen muss und ein 
kompilierbares Latex-Dokument erhalte. Da es sich nur um ca. 10 
verschiedene Tags handelt, kann ich das ruhig mit Regenechsen machen.

Liebe Grüße,

Andreas

von Klaus W. (mfgkw)


Lesenswert?

Da hätte ich doch fast den EMACS, genommen, aber schon zu spät :-)

von Andreas W. (avedo)


Lesenswert?

Guten Abend!

Wie kann man denn so etwas mit Emacs lösen?

Noch eine kleine Frage. Ist es mit der Boost-Library irgendwie möglich, 
den gefundenen Text in eine Datei Namens fund_FUNDNUMMER zu speichern? 
Oder ist es zumindest möglich die Fundnummer zu ermitteln oder immer nur 
die Ersetzung für den ersten Fund vorzunehmen?

Liebe Grüße,

Andreas

von Klaus W. (mfgkw)


Lesenswert?

Andreas Wilhelm schrieb:
> Wie kann man denn so etwas mit Emacs lösen?


Mit M-C-% (also: Esc drücken, dann Ctrl + Shift + [5/%]-Taste),
dann den RE eingeben, Return, dann den Ersetzungstext, wieder
Return und entweder jedes Vorkommen abnicken, oder mit ! alle
folgenden ohne weitere blöde Nachfrage ersetzen lassen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.