www.mikrocontroller.net

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


Autor: Andreas Wilhelm (avedo)
Datum:

Bewertung
0 lesenswert
nicht 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:
buffer = boost::regex_replace(
  buffer, 
  boost::regex("\\[tag\\](.*)\\[\\/tag\\]"), 
  string("\\href{$1}{$1}")
);

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

Autor: sebastians (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist .* zu "greedy"?

Autor: Andreas Wilhelm (avedo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Andreas Wilhelm (avedo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Wilhelm (avedo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Autor: Andreas Wilhelm (avedo)
Datum:

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

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

Liebe Grüße,

Andreas

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Andreas Wilhelm (avedo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Andreas Wilhelm (avedo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.