Qt i wyrażenia regularne

Qt i wyrażenia regularne
grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
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:

Kopiuj
[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:

Kopiuj

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:

Kopiuj

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

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:7 minut
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ć):

Kopiuj
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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 5x, ostatnio: MarekR22
EM
Ja odkąd poznałem wyrażenia regularne z biblioteki boost staram się z nich korzystać zawsze jak tylko muszę sprawdzać poprawność danych na wejściu o ile nie są to proste ciągi które mogę porównać ==... Dlaczego nie powinno się ich nadużywać? Ze względu na wydajność?
grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
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:

Kopiuj
    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 :)

edytowany 4x, ostatnio: grzesiek51114

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.