Seite 1 von 1

Anfänger Frage: replace ab Position.

Verfasst: 23. September 2009 15:36
von Alex66955
Hallo Leute,

Bin ein Neuling in Sachen C++ und QT und bin auf folgendes Problem gestoßen.
Ich möchte Daten zeilenweise aus einer Datei auslesen und mittels replace Teilstrings ersetzen. Dies funktioniert auch jedoch ist es mir noch nicht gelungen erst ab einer bestimmten Position im QString zu suchen/ersetzen.

In 'C' würde ich das mit einem Zeiger machen der auf das Erste gefundene Wort zeigt... aber hab dies nicht so richtig umsetzen können.

Mein Ansatz:

Code: Alles auswählen

int verarbeitung::einlesen(ifstream *in, ofstream *out){
    string buff;
    QString zeile;
    QStringList swort_list;
    int komm_begin, komm_end, komm_zeilig;

    /*RegExp Liste*/
    swort_list << "(^switch\\b|\\bswitch\\b)";

    /*Zeile Auslesen*/
    getline(*in, buff);
    /*Umwandeln in QString*/
    zeile = QString::fromStdString(buff);

    QRegExp rx_begin("(/\\*)");
    QRegExp rx_end("(\\*/)");
    QRegExp rx_zeilig("(//)");

    komm_begin  = rx_begin.indexIn(zeile);
    komm_end    = rx_end.indexIn(zeile);
    komm_zeilig = rx_zeilig.indexIn(zeile);

    for(int i = 0; swort_list.size() != i; i++){
        /*RegExp Initialsierung*/
        QRegExp rx_swort(swort_list[i]);
        
        /*Schlüsselwort Speichern*/
        rx_swort.indexIn(zeile);
        QString swort = rx_swort.cap(1);

        /*Suchen und ersetzen*/
        zeile.replace(rx_swort,"<h2>"+swort+"</h2>");
    }
    *out << zeile.toStdString();
    return 0;
}
Weis wer wie ich das tun kann?:

Code: Alles auswählen

zeile.replace(rx_swort,"<h2>"+swort+"</h2>");
Gruß Alex

Verfasst: 23. September 2009 16:00
von Christian81
Bei QString::indexOf() kann man doch auch einen Startindex mit angeben...

Verfasst: 23. September 2009 17:02
von Alex66955
Hab mir mal indexOf() angeguckt. Jedoch bin ich bei der Implementierung gescheitert.
Ich weis das die Syntax so aussieht: int QString::indexOf ( const QRegExp & rx, int from = 0 )

Also bei meinem Beispiel
zeile.replace(rx_swort,"Text");

zeile.indexOf().replace()??

Aber warum const QRegExp & rx

Kann mir einer dabei helfen? Ich hab bestimmt ein Denkfehler

Verfasst: 23. September 2009 17:29
von Christian81
Du möchtest rx_swort durch "Text" ersetzen - also einfach zeile.replace(rx_swort,"Text") - wo ist das Problem? Wenn Du etwas ab einer bestimmten Position ersetzen willst (also weist wo Du was einfügen willst) nimmst du zeile.replace( position, "Text")

Verfasst: 23. September 2009 17:53
von Alex66955
Mhh mein Problem ist das die Funktion ja nach regulären Ausdrücken in der Zeile sucht und diese dann durch die Vorgabe "text" ersetzt was ja auch gut ist und funktioniert.

Aber ich suche nach einer Möglichkeit ebenfalls nach regulären Ausdrücken zu suchen aber eben nicht von Anfang der Zeile sonder beispielsweise erst ab Position "12". In Worten "Suche ab Zeile 12 "\\b(case)" und ersetze dies durch "Text".

zeile.replace( position, "Text") ersetzt ja nur die Angaben mit der genauen position aber sucht ja nicht danach.

Verfasst: 23. September 2009 21:25
von Christian81
Dann eben ein

Code: Alles auswählen

while(str.indexOf(rx, pos) =! -1)
  str.replace(pos, "blub", "wasauchimmer")

Verfasst: 24. September 2009 07:56
von Alex66955
Vielen Dank das wars ;).

Also Funktioniert soweit aber habe bemerkt das es bei meinem Fall keine Lösung ist.

Also mein Programm soll aus einem C++ Quelltext die standard Schlüsselwörter suchen und mit einer HTML Formatierung ersetzen also " int zahlen" zu "<h2>int </h2> zahlen". Mit der Funktion replace macht das Programm das auch schön. Nur Bei Kommentaren "/*, */, //" soll er natürlich nicht formatieren.
Habe das ganze in C schoneinmal geschrieben und die anfangs und end Position jedes Schlüsselwortes in eine Stuktur sortiert nach Anfangs Position eingelesen. Nach dem einlese Vorgang bin ich Position für Position durch die zeile gegangen und hab bei auftreten eines Schlüsselwortes die Formatierung durchgeführt und bei auftreten eines Anfangs Kommentare ein boolean gesetzt um auf folgend auftreffende Schlüsselwörter nicht zu reagieren.... Ich glaub ihr wisst was ich meine..

Bekomme ich das mit C++ einfacher hin?
Mit replace ab einer bestimmten Position decke ich ja nur das Auftreten eines Kommentares ab. Bei mehreren Kommentaren in einer zeile wird der Code ziemlich unübersichtlich

Mein Ansatz war.

Code: Alles auswählen

        for(aktuell_posi = 0, swort_begin = 0; zeile.indexOf(rx_swort,aktuell_posi) != -1;){
            swort_begin = zeile.indexOf(rx_swort,aktuell_posi);
            QString swort = rx_swort.cap(1);
            ersetzend = "<h2>" + swort + "</h2>";

            /*Kommentar Position. -1 Falls nicht vorhanden*/
            komm_begin  = rx_begin.indexIn(zeile);
            komm_end    = rx_end.indexIn(zeile);
            komm_zeilig = rx_zeilig.indexIn(zeile);

            if(komm_begin != -1 && komm_end != -1 && komm_zeilig == -1){
                if(zeile.indexOf(rx_swort,aktuell_posi) < komm_end && zeile.indexOf(rx_swort,aktuell_posi) > komm_begin){
                    aktuell_posi = swort_begin + 1;
                    continue;
                }
                zeile.replace(swort_begin,swort.size(),ersetzend);
                aktuell_posi += swort_begin + ersetzend.size();
            }
            if(komm_begin != -1 && komm_end == -1){
                 if(zeile.indexOf(rx_swort,aktuell_posi) > komm_begin){
                    break;
                }
                zeile.replace(swort_begin,swort.size(),ersetzend);
                aktuell_posi += swort_begin + ersetzend.size();

            }
            if(komm_begin == -1 && komm_end != -1){
                 if(zeile.indexOf(rx_swort,aktuell_posi) < komm_end){
                    aktuell_posi = swort_begin + 1;
                    continue;
                }
                zeile.replace(swort_begin,swort.size(),ersetzend);
                aktuell_posi += swort_begin + ersetzend.size();
            }

        }


Habs jetzt anderst gelöst mittels meinem alten C Code