[gelöst] QString:replace

Alles rund um die Programmierung mit Qt
Antworten
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

[gelöst] QString:replace

Beitrag von Mani99 »

Hi,

ich habe ein problem mit replace unter Qt 4.7.3.

Ich habe einen string, in dem die schlüsselwörter @@COPYRIGHT_YEAR und @@COPYRIGHT vorkommen, in genau dieser reihenfolge.

Das problem ist jetzt, das replace nicht case sensitive arbeitet, auch nicht wenn ich es extra mit angeben!

Verwende ich replace nicht richtig?

Als testbeispiel:

Code: Alles auswählen

#define print(x) qDebug(qPrintable(x))

#include <QtCore/QCoreApplication>
#include <QDate>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString str = "** Copyright (c) @@COPYRIGHT_YEAR by @@COPYRIGHT.";

    print(QString::number(str.indexOf("@@COPYRIGHT", Qt::CaseSensitive)));
    print(QString::number(str.indexOf("@@COPYRIGHT_YEAR", Qt::CaseSensitive)));

    if(str.contains("@@COPYRIGHT"))
        str.replace("@@COPYRIGHT","Max Mustermann", Qt::CaseSensitive);

    if(str.contains("@@COPYRIGHT_YEAR"))
        str.replace("@@COPYRIGHT_YEAR",QDate::currentDate().toString("yyyy"), Qt::CaseSensitive);

    print(str);

    return a.exec();
}
Zuletzt geändert von Mani99 am 5. Mai 2011 08:15, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich sehe jetzt keine Problem:

Code: Alles auswählen

17
17
** Copyright (c) Max Mustermann_YEAR by Max Mustermann.
Und was soll das ganze mit case sensitivity zu tun haben?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Naja, case sensitive bedeutet für mich, das der string @@COPYRIGHT_YEAR != @@COPYRIGHT ist.

Jedoch ersetzt replace in beiden schlüsselwörtern das COPYRIGHT durch "Max Mustermann", was ich aber nicht möchte.

Code: Alles auswählen

    if(str.contains("@@COPYRIGHT"))
        str.replace("@@COPYRIGHT","Max Mustermann", Qt::CaseSensitive);

    if(str.contains("@@COPYRIGHT_YEAR"))
        str.replace("@@COPYRIGHT_YEAR",QDate::currentDate().toString("yyyy"), Qt::CaseSensitive); 
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Beitrag von brax »

case sensitive bedeutet, dass Groß- und Kleinschreibung beachtet wird. Daher ist das Verhalten, das Du beschreibst absolut ok. Um das zu erreichen, was Du möchtest, solltest Du den Overload von replace benutzen, der eine QRegExp bekommt. Diese kannst Du so formulieren, dass sie nur die ganzen Wörter @@COPYRIGHT_YEAR bzw. @@COPYRIGHT matcht (Stichwort: word boundary).

Alternativ könntest Du auch zuerst @@COPYRIGHT_YEAR ersetzen und dann @@COPYRIGHT.
softwaremaker
Beiträge: 149
Registriert: 1. April 2009 19:25

besser

Beitrag von softwaremaker »

nimm doch besser:

@@COPYRIGHT_YEAR
und
@@COPYRIGHT_NAME

das ist eindeutig und funktioniert
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

oder dreh die Befehle zum Ersetzen um, sodass erst COPYRIGHT_YEAR ersetzt wird.
Hinterher existiert COPYRIGHT nur noch ein mal.
Linux, das längste Text-Adventure aller Zeiten
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Danke für die antworten!

Keywörter suche umdrehen oder andere keywörter verwenden ist leider keine option, da der benutzer die keywörter selbst festlegen kann.

Aber der tipp mit dem word boundary hat funktioniert, einfach an den regex pattern noch "\\b" anfügen und es wird nach dem ganzen wort gesucht.
Antworten