QRegExp stoppt nach einem Treffer?!

Alles rund um die Programmierung mit Qt
Antworten
PyCoder
Beiträge: 18
Registriert: 4. April 2010 08:35

QRegExp stoppt nach einem Treffer?!

Beitrag von PyCoder »

Hi ich hab ein kleines Problem mit QRegExp und komm ned auf den Fehler.


Also ich würde gerne die Datei /proc/partitions einlesen, was auch klappt.
Wenn ich jetzt aber die Partitionen mit QRegExp filtern will bricht mit QRegExp nach dem ersten Treffer ab!


Sprich QRegExp findet sda1 und schluss, dabei sind in der Datei bzw im QString noch sda2, sda3, sdb1, sdc1 usw usf...

Kann mir jemand helfen? :cry:

Mein Code sieht folgender massen aus:

Code: Alles auswählen

void myDialog::getPartitions() {
    QFile f("/proc/partitions");
    f.open(QIODevice::ReadOnly);
    QString device_list = f.readAll();
    QRegExp rx("\\w+\\d+\n");
    rx.indexIn(device_list);
    std::cout << device_list.toStdString() << std::endl;
    std::cout << rx.captureCount() << std::endl;
    std::cout << rx.cap(0).toStdString() << std::endl;
    f.close();
}


Und die Ausgabe ist...

Code: Alles auswählen

Starte /home/pycoder/KCrypt/KCrypt...
major minor  #blocks  name

   8        0  488386584 sda
   8        1  305104896 sda1
   8        2     201372 sda2
   8        3   41953747 sda3
   8        4          1 sda4
   8        5    4192965 sda5
   8        6  136929964 sda6
   8       16  312571224 sdb
   8       17  312568641 sdb1
   8       32  312571224 sdc
   8       33  312568641 sdc1
   8       48  312571224 sdd
   8       49  312568641 sdd1
   8       64  312571224 sde
   8       65  312568641 sde1
 252        0   41951727 dm-0
   9        0  937705728 md0
 252        1    4192965 dm-1
 252        2  136927944 dm-2
 252        3  937703708 dm-3
 252        4  305104896 dm-4

0
sda1

/home/pycoder/KCrypt/KCrypt beendet, Rückgabewert 0
[/code]
sowas
Beiträge: 105
Registriert: 19. September 2006 16:02

QRegExp stoppt nach einem Treffer?!

Beitrag von sowas »

Hallo,
du musst alle Elemente der Liste durchlaufen, du siehst jetzt nur das erste
Array.
frohe Ostern
PyCoder
Beiträge: 18
Registriert: 4. April 2010 08:35

Re: QRegExp stoppt nach einem Treffer?!

Beitrag von PyCoder »

sowas hat geschrieben:Hallo,
du musst alle Elemente der Liste durchlaufen, du siehst jetzt nur das erste
Array.
frohe Ostern

Hmm also ich hab den Code mal geändert aber jetzt hab ich ne voll komische Ausgabe...

Code: Alles auswählen

void myDialog::getPartitions() {
    QFile f("/proc/partitions");
    f.open(QIODevice::ReadOnly);
    QString device_list = f.readAll();
    QStringList list = device_list.split("\n");
    QStringList new_list;
    QString new_line;
    QRegExp rx("(\\w+\\d+$)");
    for (int i; i < list.size(); i++) {
        QString line = list.at(i);
        rx.indexIn(line);
        new_list.append(rx.cap());
        std::cout << rx.cap().toStdString() << std::endl;
        new_line = new_list.at(i);
    }

Code: Alles auswählen

Starte /home/pycoder/KCrypt/KCrypt...



sda1
sda2
sda3
sda4
sda5
sda6

sdb1

sdc1

sdd1

sde1

md0





/home/pycoder/KCrypt/KCrypt beendet, Rückgabewert 0

Mit remove(" ") oder remove("\t") bekomm ich die abstände nciht raus und leider wird das ganze 1:1 so mittels addItems an meine Combobox übergeben was voll schrecklich aussieht...


HILFE ^^
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Sind sda und dm-0 keine gültigen Partitionen?
PyCoder
Beiträge: 18
Registriert: 4. April 2010 08:35

Beitrag von PyCoder »

upsala hat geschrieben:Sind sda und dm-0 keine gültigen Partitionen?

sda = device also keine Partition
dm-0 = device mapper also keine Partition


Also die brauch ich ned... aber wie bekomm ich jetzt das ganze sauber raus? oO
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Was steht in den Strings drinnen, die du ausfiltern willst?
honda71
Beiträge: 49
Registriert: 12. Juli 2006 16:16

Beitrag von honda71 »

Code: Alles auswählen

void myDialog::getPartitions() {
    QFile f("/proc/partitions");
    f.open(QIODevice::ReadOnly);
    QString device_list = f.readAll();
    QStringList list = device_list.split("\n");
    QStringList new_list;
    QString new_line;
    QRegExp rx("(\\w+\\d+$)");
    for (int i; i < list.size(); i++) {
        QString line = list.at(i);
        if (-1!=rx.indexIn(line) {
          new_list.append(rx.cap());
          std::cout << rx.cap().toStdString() << std::endl;
          new_line = new_list.at(i);
        }
    }
Müsstest Du nicht einfach nur prüfen, ob der Ausdruck in der Zeile gefunden wurde? Und nur dann einfügen?
Ich hab's mal für Dich eingebaut...
PyCoder
Beiträge: 18
Registriert: 4. April 2010 08:35

Beitrag von PyCoder »

honda71 hat geschrieben:

Code: Alles auswählen

void myDialog::getPartitions() {
    QFile f("/proc/partitions");
    f.open(QIODevice::ReadOnly);
    QString device_list = f.readAll();
    QStringList list = device_list.split("\n");
    QStringList new_list;
    QString new_line;
    QRegExp rx("(\\w+\\d+$)");
    for (int i; i < list.size(); i++) {
        QString line = list.at(i);
        if (-1!=rx.indexIn(line) {
          new_list.append(rx.cap());
          std::cout << rx.cap().toStdString() << std::endl;
          new_line = new_list.at(i);
        }
    }
Müsstest Du nicht einfach nur prüfen, ob der Ausdruck in der Zeile gefunden wurde? Und nur dann einfügen?
Ich hab's mal für Dich eingebaut...


Also ich bekomm folgendes mit deinem Code:

Nimmt man dein IF raus funzt es wieder wie bei meinem Code...
Ist das IF drin gibts nen Absturz... oO

Code: Alles auswählen

Starte /home/pycoder/KCrypt/KCrypt...
sda1
ASSERT failure in QList<T>::at: "index out of range", file /usr/include/qt4/QtCore/qlist.h, line 439
Das Programm ist abgestürzt.
/home/pycoder/KCrypt/KCrypt beendet, Rückgabewert 0
honda71
Beiträge: 49
Registriert: 12. Juli 2006 16:16

Beitrag von honda71 »

Also bei mir klappt's:

Hier mal mein Testprogramm. Mit kleinen Änderungen Deines Codes (qDebug statt std:cout und Verwendung von FOREACH):

Code: Alles auswählen

void test()
{
      QStringList list;
      list << "   8        0  488386584 sda"
           << "    8        1  305104896 sda1"
           << "    8        2     201372 sda2"
           << "    8        3   41953747 sda3"
           << "    8        4          1 sda4"
           << "    8        5    4192965 sda5"
           << "    8        6  136929964 sda6"
           << "    8       16  312571224 sdb"
           << "    8       17  312568641 sdb1"
           << "    8       32  312571224 sdc"
           << "    8       33  312568641 sdc1"
           << "    8       48  312571224 sdd"
           << "    8       49  312568641 sdd1"
           << "    8       64  312571224 sde"
           << "    8       65  312568641 sde1"
           << "  252        0   41951727 dm-0"
           << "    9        0  937705728 md0"
           << "  252        1    4192965 dm-1"
           << "  252        2  136927944 dm-2"
           << "  252        3  937703708 dm-3"
           << "  252        4  305104896 dm-4 ";
      QStringList new_list;
      QString new_line;
      QRegExp rx("(\\w+\\d+$)");
      foreach (QString line,list) {
        if (-1!=rx.indexIn(line)) {
          new_list.append(rx.cap());
          new_line = line;
        }
      }
      qDebug("Ergebnis:");
      foreach (QString eintrag,new_list)
        qDebug(eintrag.toAscii().data());
}
Und hier das Ergebnis:

Code: Alles auswählen

Ergebnis:
sda1
sda2
sda3
sda4
sda5
sda6
sdb1
sdc1
sdd1
sde1
Antworten