2017-10-25 2 views
-2

Ich versuche, einen regulären Ausdruck zu verwenden, um sicherzustellen, dass die für ein Flugzeug eingegebene Überschrift zwischen o und 360 liegt, aber ich kann es nicht zum Funktionieren bringen.Regulärer Ausdruck funktioniert nicht C++

std::regex headingCheck{"^([0-9]|1[0-9]2[0])$"}; 
    bool match = false; 
    while (!match) 
    { 
     if (std::regex_match(heading, headingCheck)) 
     { 
      heading_ = heading; 
     } 
     else 
     { 
      std::cout << "Invalid heading, can only be between 0 and 360 degrees" << std::endl; 
     } 
    } 

#

//Heading can only be between 0-360? 
    if (heading >= 0 && heading <= 360) 
    { 
     heading_ = heading; 
    } 
    else 
    { 
     std::cout << "Incorrect heading, heading can only be between 0 and 360" << std::endl; 
    } 

soll ich tun dies statt? Ist es so genau/zuverlässig?

+7

Versuchen Gehäuse zu einem int, überprüfen Sie den Bereich? - Dies ist kein Job für einen RE. –

+1

Validieren von Bereich durch Regex ist machbar, wäre aber in der Größenordnung komplexer, die einfach zu "Int" konvertieren und Bereich überprüfen. Verwenden Sie Regex nur um zu bestätigen, dass diese Nummer angegeben ist. – Slava

+0

void Aircraft :: SetHeading (int Überschrift) { \t // Überschrift kann nur zwischen 0-360 sein? \t // Regulären Ausdruck einrichten, vergleichen Sie es mit Eingabe \t Std :: Regex ÜberschriftCheck {"^ ([0-9] | 1 [0-9] 2 [0]) $"}; \t bool match = false; \t while (Spiel!) \t { \t \t if (std :: regex_match (Überschrift, headingCheck)) \t \t { \t \t \t heading_ = Position; \t \t} \t \t sonst \t \t { \t \t \t std :: cout << "Ungültige Position, kann nur zwischen 0 und 360 Grad sein" << std :: endl; \t \t} \t} \t } Sein für eine Setter-Methode, was euch meinen Bereich überprüfen? – MurrackCarn

Antwort

1

Wenn Sie noch regex wollen (obwohl dies nicht optimal ist) können Sie den folgenden Ausdruck verwenden:

std::regex re{ "^[0-9]$|^[1-9][0-9]$|^[1-2][0-9][0-9]$|^3[0-5][0-9]$|^360$" }; 
std::string headings[5] = { "0","15","390","360","23883" }; 

for (int i = 0; i < 5; ++i) 
    std::cout << "Heading " << headings[i] << " is " << (std::regex_match(headings[i], re) ? "valid" : "invalid") << std::endl; 

Erster Teil 0-9 Spieler zweiten Teil entspricht 10-99, dritten Teil entspricht 100-299 , vierten Teil entspricht 300-359, letzte Übereinstimmungen 360. Prints:

Heading 0 is valid 
Heading 15 is valid 
Heading 390 is invalid 
Heading 360 is valid 
Heading 23883 is invalid 
+1

Überschrift 275 ist ... ungültig? Hmm. Nicht ganz. –

+0

Guter Fang! Bearbeitet –