2016-05-22 10 views
-1

Ich arbeite an einem Nummer-Parser für q Qt Rechner. Ich schaffe haben einige regex, um mit den verschiedenen Arten der Zahl zu entsprechen:Nicht übereinstimmende Nummer Regex in Qt

Rationnal: ^[+-]?\d+\/[+-]?\d+$

Integer: ^[+-]?\d+\.?0*$

Real: ^[+-]?\d*\.0*[1-9][0-9]*$

Complexe: ^[+-]?[0-9]*(\.[0-9]*|\/[+-]?[0-9]+)?\$[+-]?[0-9]*(\.[0-9]*|\/[+-]?[0-9]+)?$

I Versuchen Sie, sie mit der folgenden Funktion auf QString zu verwenden:

parser.h 210

:

 bool isRationnal(const QString s) 
{ 
    QRegExp ratioExp ("^[+-]?\d+\/[+-]?\d+$"); 
    return ratioExp.exactMatch(s); 
} 
bool isInteger(const QString s) 
{ 
    QRegExp regExp ("^[+-]?\d+\.?0*$"); 
    return regExp.exactMatch(s); 
} 
bool isReal(const QString s) 
{ 
    QRegExp regExp ("^[+-]?\d*\.0*[1-9][0-9]*$"); 
    return regExp.exactMatch(s); 
} 
bool isComplex(const QString s) 
{ 
    QRegExp regExp ("^[+-]?[0-9]*(\.[0-9]*|\/[+-]?[0-9]+)?\$[+-]?[0-9]*(\.[0-9]*|\/[+-]?[0-9]+)?$"); 
    return regExp.exactMatch(s); 
} 
bool isNumber(const QString s){ 
    bool ok=false; 
    s.toInt(&ok); 
    return ok; 
} 

main.c:

QString test ="6/90"; 
    if(isReal(test)) 
     printf("real\n"); 

    if(isInteger(test)) 
     printf("Integer\n"); 

    if(isRationnal(test)) 
     printf("Rationnal\n"); 

    if(isNumber(test)) 
     printf("Number\n"); 
    else printf("et merde\n"); 
    QRegExp ratioExp ("^[+-]?\d+\/[+-]?\d+$"); 
    QRegExp IntExp ("^[+-]?\d+\.?0*$"); 
    QRegExp RealExp ("^[+-]?\d*\.0*[1-9][0-9]*$"); 
    QRegExp CplxExp ("^[+-]?[0-9]*(\.[0-9]*|\/[+-]?[0-9]+)?\$[+-]?[0-9]*(\.[0-9]*|\/[+-]?[0-9]+)?$"); 
    if(ratioExp.isValid()) 
     printf("ratio valide\n"); 

    if(IntExp.isValid()) 
     printf("int valide\n"); 
    if(RealExp.isValid()) 
     printf("real valide\n"); 
    if(CplxExp.isValid()) 
     printf("cplx valide\n"); 

    return 0; 
} 

Ich habe versucht, diesen Code mit mehreren QString zu laufen, die Zahlen sind, aber es in der Regel nicht. Vor allem: es ist nicht mathc mit Nummer, wenn es nur einen Charakter wie Test = "4" gibt.

Wissen Sie, warum diese boolesche Funktion fehlschlägt? Vielleicht verwende ich die falsche Qt-Funktion, aber nachdem ich mehrere versucht habe, sieht es so aus, als würde ich nach etwas suchen.

Fühlen Sie sich frei konstruktive Kritik loswerden zu geben,

Vielen Dank,

Théophile

+0

Ihr ganzzahliger Test scheint einen Dezimalpunkt zu akzeptieren. Und Sie müssen Ihre Back-Schrägstriche entkommen – Galik

+0

Obwohl dies wahrscheinlich nicht Ihr Problem verursacht, aber 'exactMatch()' schließt bereits die Regex mit dem Anfang der Zeichenfolge und Ende der String-Anker, so dass es keine Notwendigkeit, sie zu setzen. –

+0

In der Tat, der Test für Integer muss Zahlen wie "3.0" akzeptieren, werden sie in 3 umgewandelt werden. Escaping zurück Schrägstrich? Ich werde das untersuchen. Wie mache ich das? Durch doppelten Backslash? –

Antwort

3

Ihr Ausdruck ist in Ordnung, aber \d mit \\d ersetzen. Getestet hast du Code in meinem Programm. Und ich empfehle wirklich this site, die Ihren Ausdruck online debuggen können.

Einzelheiten von Qt Official Documentation:

Hinweis: Der C++ Compiler Schrägstriche in Strings umwandelt. Um eine \ in einem regulären Ausdruck einzuschließen, geben Sie sie zweimal ein, d. Um den Backslash Zeichen selbst zu entsprechen, geben Sie es viermal ein, d.

+0

Danke, es war in der Tat das Problem! Hab ein gutes WE! –

+0

:) Und es gibt andere Abkürzungen für Gruppen von Zeichen, die Sie Doppel-Back-Schrägstrich wie '\\ s'' \\ w' '\\ b' müssen ... tief in Qt-Dokument. –

Verwandte Themen