QString::replace( )?

Alles rund um die Programmierung mit Qt
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

Beitrag von Whitefurrows »

Hallo Bernd,

vielen dank für den Tipp, aber leider kann ich es so nicht machen. Es sollen tatsächlich nur Strings ersetzt werden, in denen Zeilenumbrüche und/oder klammer(n) vorkommen. Sonst noch eine Idee?

Gruß,

Whitefurrows
bst
Beiträge: 56
Registriert: 7. November 2006 13:16
Wohnort: Ilsfeld

Beitrag von bst »

Hi,

bring mal ein paar Beispiele wie so ein String aussehen soll (vorher & nachher), ich kann mir das bisher noch nicht vorstellen :-(

cu, Bernd
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

Beitrag von Whitefurrows »

Hi,

nichts leichter als das ;-), bitteschön:

vorher
<1>Textteil1 <2>Textteil2
<3>Textteil3 <4>Textteil4
<5>Textteil5 <6>Textteil6

nachher
<b>(1)</b>Textteil1 <b>(2)</b>Textteil2</br>
<b>(3)</b>Textteil3 <b>(4)</b>Textteil4</br>
<b>(5)</b>Textteil5 <b>(6)</b>Textteil6

ich hoffe es ist so verständlich, wenn nicht einfach nochmal nachfragen!

Gruß,

Whitefurrows
bst
Beiträge: 56
Registriert: 7. November 2006 13:16
Wohnort: Ilsfeld

Beitrag von bst »

Hi,

sowas ?

cu, Bernd
--

Code: Alles auswählen

	QRegExp rx("<([^<>]*)>");
	QRegExp rx2("([\r\n])");

	QString test("<1>Textteil1 <2>Textteil2\n<3>Textteil3 <4>Textteil4\n<5>Textteil5 <6>Textteil6\n");
	qDebug() << test.replace(rx, "<b>(\\1)</b>").replace(rx2,"</br>\\1");
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

Beitrag von Whitefurrows »

Hallo,

ja genau so, bis auf den kleinen Fehler, das auch bei Strings die keine Klammern enthalten auch ein "<br>" hinzugefügt wird. Genau das wollte ich vermeiden, indem ich den Ausdruck mit einem UND Verknüpfe, da ich später in der Schleife zwischen HTML-Text und Plain-Text unterscheide. Wie kann ich den die zwei Ausdrücke mit einem UND Verknüpfen oder geht das nicht?

Gruß,

Whitefurrows

P.S.
Finde ich super wie du deine Beiträge schreibst, durch die Beispiele ist es immer gleich verständlich was du meinst!
bst
Beiträge: 56
Registriert: 7. November 2006 13:16
Wohnort: Ilsfeld

Beitrag von bst »

Hi,

Du brauchst hier IMHO zwei Ersetzungen da Du auch mehrere <...> in einer Zeile haben kannst. Gleichzeitiges Ersetzen mehrerer <...> und eines \n bekomme zu mindestens ich nicht mit einem RegExp hin.

Wenn in einem String mehrere Zeilen sein können, von denen einige <...> enthalten, andere nicht und nur bei den Ersteren der \n ersetzt werden soll brauchst Du M.E. in rx2 eigentlich einen positiven Lookbehind. Da QRegExp das nicht kann muss man sich wohl mit einem positiven Lookahead und einem Zwischenspeicher behelfen. Damit bin ich dann aber auch an den Grenzen meiner 'RegExp-Kenntnisse' angelangt ...

Ansonsten (alle \n eines String ersetzen wenn in mindestens einer Zeile ein <...> vorkommt) könnte man vor dem Ersetzen auch einfach testen, ob rx überhaupt matched.

Code: Alles auswählen

If (rx.indexIn(test) > -1)
Alternativ (ohne dem Lookahead) könnte man den String bestimmt auch an den Zeilengrenzen in eine QStringList splitten, dort zeilenweise ersetzen, ggf. einen </br> anfügen und das Ganze dann wieder Joinen.

Versuch's mal hiermit, mit dem Lookahead habe ich eine Weile gekämpft ;-)

HTH, Bernd
--

Code: Alles auswählen

	QRegExp rx("<([^<>]*)>");
	QRegExp rx2("(?=[^\\n\\r]*<b>\\(\\d+\\)</b>)([^\\n\\r]*)([\\r\\n])");

	QString test("<1>Textteil1 <2>Textteil2\nTextteil3 Textteil4\n<5>Textteil5 <6>Textteil6\n");
	qDebug() << test.replace(rx, "<b>(\\1)</b>").replace(rx2,"\\1</br>\\2");
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

Beitrag von Whitefurrows »

Hallo,

echt genial erklärt und super geholfen, von mir die Note 1++ ;-) Funktioniert jetzt alles perfekt und zur Sicherheit habe ich mir auch gleich OReilly Mastering Regular Expressions bestellt, damit ich es das nächstemal selbst kann.

Gruß,

Whitefurrows
Antworten