Seite 1 von 1

[gelöst] QString:replace

Verfasst: 4. Mai 2011 16:34
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();
}

Verfasst: 4. Mai 2011 16:52
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?

Verfasst: 4. Mai 2011 16:56
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); 

Verfasst: 4. Mai 2011 17:06
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.

besser

Verfasst: 4. Mai 2011 18:17
von softwaremaker
nimm doch besser:

@@COPYRIGHT_YEAR
und
@@COPYRIGHT_NAME

das ist eindeutig und funktioniert

Verfasst: 4. Mai 2011 18:51
von RavenIV
oder dreh die Befehle zum Ersetzen um, sodass erst COPYRIGHT_YEAR ersetzt wird.
Hinterher existiert COPYRIGHT nur noch ein mal.

Verfasst: 5. Mai 2011 08:14
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.