Qt i wyrażenia regularne

0

Cześć.

Piszę sobie w Qt programik do zamiany liczby arabskiej z przedziału 1-3999 na rzymską. Postanowiłem zrobić walidację wejścia poprzez zapięcie na obiekt klasy QLineEdit wyrażenia regularnego. Użytkownik ma wpisywać ciąg 'N' liczb z zadanego przedziału oddzielonych przecinkami.

Tutaj zrobiłem wyrażenie opisujące liczbę z podanego przedziału i przecinek na końcu tej liczby:

[1-3]{0,1}[0-9]{0,3},{0,1}

Nie wiem jak zrobić powtarzanie tego wzorca. Dopisywałem już gwiazdki, tworzyłem grupę z całości w nawiasie i dopisywałem do tego również gwiazdki i inne zależności i albo walidował mi nieprawidłowe wyrażenie albo w ogóle nie chciał pisać.

Popełniłem taki slocik do testowania mojego wyrażenia:


void OknoGlowne::sprawdz(QString tekst){
    QRegularExpression re("([1-3]{0,1}[0-9]{0,3},{0,1})");
    QRegularExpressionMatch match=re.match(tekst);

    if(match.hasMatch()){
        QString matched=match.captured(0);
        this->ui->leLiczby->setText(matched);
    }
}

Slot jest podłączony do sygnału obiektu QLineEdit w ten sposób:


connect(this->ui->leLiczby,SIGNAL(textChanged(QString)),this,SLOT(sprawdz(QString)));

Przyznaję, że wyrażeń regularnych nie stosuje często i mam z tym problem.
Jak wymusić prawidłowe powtarzanie stricte tego wzorca, żeby dopuszczał po przecinku tylko liczby z podanego zakresu?

Pozdrawiam
Grzesiek

1

zawsze jak piszesz o wyrażeniu regularnym napisz dokładnie co ma dopasować by wszystko było jasne. Najlepiej dać kilka przykładów pozytywnych i negatywnych.

Z tego co zrozumiałem potrzebujesz czegoś takiego (bez dokładniejszego opisu trudno powiedzieć):

QRegExp re("([1-3]\\d{3}|[1-9]\\d{1,2})(,[1-3]\\d{3}|[1-9]\\d{1,2})*");

Wygląda na to, że strasznie przekombinowujesz. Czy wiesz, że jest coś takiego jak <url=qt-project.org/doc/qt-5.0/qtgui/qvalidator.html>QValidator</url> i dziedziczące po nim QIntValidator oraz QRegExpValidator.
Rozdzielanie liczb przecinkiem w jednym edytorze też jest strasznym rozwiązaniem UI. Nie lepiej mieć jeden edytor z jedną liczą, albo tabelę?

Dodatkowo ludzie często mają tendencje do nadużywania wrażeń regularnych. IMO wyrażenia regularne powinny być stosowane jedynie w prostych przypadkach lub gdy jest to opcja konfiguracyjna programu. W innych wypadkach lepiej napisać dedykowany kod.

0

Chcę dopasować np. taki ciąg:
1234,3999,12,199,432,871

czyli każdą liczbę od 1 do 3999 po przecinku. Teoretycznie ciąg może być nieskończony czyli: liczba przecinek liczba przecinek itd.
Twoje wyrażenie pozwala wpisać tylko liczbę i nawet program nie przyjmuje przecinka. Właśnie o to chodzi, że wyrażenie teoretycznie dobre nie działa (tzn. mnie się wydaje, że jest dobre).

O QValidatorze nie słyszałem ale właśnie przeczytałem i zastosowałem i z tego co widzę to chyba nie będzie potrafiło dopasować powyższego ciągu.
Potrafi jedynie dopasować inta z podanego zakresu, a mnie bardziej chodzi o ciąg intów.

Poprawka
Z QRegularExpressionValidatorto działa, tylko muszę popracować nad odpowiednim zakresem liczb.

Poprawna nr 2
No i ekstra. Działa ten kod w konstruktorze okna:

    QRegularExpression reg("([1-3]{0,1}[0-9]{0,3})(,[1-3]{0,1}[0-9]{0,3})*");
    QValidator *wal = new QRegularExpressionValidator(reg,this);
    this->ui->leLiczby->setValidator(wal);

Idzie plusik :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1