Anfänger Frage: replace ab Position.

Verschiedenes zu Qt
Antworten
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

Anfänger Frage: replace ab Position.

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Bei QString::indexOf() kann man doch auch einen Startindex mit angeben...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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")
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Dann eben ein

Code: Alles auswählen

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

Beitrag 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
Antworten