Regular Expression tr1:regex_match



  • Hallo Leute

    Habe in Visual Studio 2008 eine Funktion implementiert zum überprüfen von ip Adressen. Hier funktioniert meine Überprüfung. Nun habe ich mein Projekt nach Visual Studio 2010 portiert. Nun liefert mir die Funktion ein anderes Ergebnis.

    Habe dazu mal ein kleines Beispiel in VS2008 und VS2010 implementiert:

    #include "stdafx.h"
    #include <regex>
    #include <string>
    
    int _tmain(int argc, _TCHAR* argv[])
    {	
       std::string ip = "220.56.1.1";
       std::tr1::regex ex("((([01]?[0-9]{1,2})|(2[0-4][0-9]|25[0-5]))\\.){3}(([01]?[0-9]{1,2})|(2[0-4][0-9]|25[0-5]))");
    
       bool erg = std::tr1::regex_match(ip,ex);
    
       return 0;
    }
    

    regex_match liefert in VS2008 "true" und in VS2010 "false".

    Kann mir da jemand weiter helfen?



  • Ein Bug, Unerklärlich, nicht nachvollziehbar...

    Ihr meint immer man soll konkrete Fragen stellen, ein einfaches Beispiel geben. Dann kann und wird einem geholfen. Das habe ich nun gemacht, weiß nun keiner eine Antwort.


  • Mod

    Ich würde sagen VS-2010 hat hier einen Bug:

    #include "stdafx.h" 
    #include <regex> 
    #include <string> 
    #include <iostream>
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[]) 
    {    
    	{
    		string ip = "56."; 
    		tr1::regex ex("((([01]?[0-9]{1,2})|(2[0-4][0-9]|25[0-5]))\\.){1}"); 		
    		bool erg = tr1::regex_match(ip,ex); 
    		cout << ip << '\t' << erg << endl;
    	}
    	{
    		string ip = "1."; 
    		tr1::regex ex("((([01]?[0-9]{1,2})|(2[0-4][0-9]|25[0-5]))\\.){1}"); 		
    		bool erg = tr1::regex_match(ip,ex); 
    		cout << ip << '\t' << erg << endl;
    	}
    	{
    		string ip = "56.1."; 
    		tr1::regex ex("((([01]?[0-9]{1,2})|(2[0-4][0-9]|25[0-5]))\\.){2}"); 		
    		bool erg = tr1::regex_match(ip,ex); 
    		cout << ip << '\t' << erg << endl;
    	}
    
       return 0; 
    }
    

    Bei einfacher Wiederholung liefert 56. und 1. einen Match. Beide zusammen ein false.

    Ich habe einen Bug auf connect aufgemacht:
    https://connect.microsoft.com/VisualStudio/feedback/details/648543/tr1-regex-doesnt-match-a-valid-pattern-with-repetition



  • Na supi. Nun arbeite ich seit 1 Woche mit Visual Studio 2010 und habe schon den zweiten Bug entdeckt.

    Dank dir für deine Antwort und deinen Bugreport.


  • Mod

    1. Ich habe SP1 nicht geprüft. Evtl. darin behoben.
    2. Was für einen anderen Fehler hast Du gefunden? Hast Du den gemeldet?



  • Hallo Martin:

    1. SP1? Den gibts ers in der Beta Variante. Richtig?

    2. Hier der Link dazu: http://www.c-plusplus.net/forum/282569
    Gemeldet: Hat hustbear für mich gemacht. Gibts da Bonuspunkte fürs reporten? 🙂


  • Mod

    Nein. Pluspunkte gibt es nicht...

    In den Betaphasen für 2005+2008 gab es für Bugreports Kristallwürfel (Seitenlänge 6cm ca.) mit einer Danksagung. Typisch amerikanischer Staubfänger.

    Bei 2010 habe ich zu wenig Zeit gehabt.


  • Mod

    Zu dem Bug: Der ist in SP1 auch noch drin.

    In der nächsten VC Compiler und Library Versin (17) ist er behoben.
    Siehe connect.microsoft.com



  • Hallo

    Ja wann kommt die neue Version. SP1 ist ja sogar erst in der Beta verfügbar.

    Das mit den Versionen habe ich eh noch nicht ganz verstanden.

    Visual Studio 2008 ist VC 9
    Visual Studio 2010 ist VC 10

    VC 11 kommt dann erst mit der nächsten Entwicklungsumgebung? Wenn man nach VC 11 bei Google sucht findet man ja gar nichts.

    Und was meinst du mit Library Version(17). Hier habe ich auch keine Informationen gefunden.


  • Mod

    1. Richtig SP1 ist als Beta vorhanden.
    2. Habe ich bzgl. dieses Bugsnachgefragt und der Fix wird nicht in SP1 hineinkommen, denn er scheint omplexer zu sein.
    3. Die offiziellen VS-Versionen weichen von der internen Compiler Version ab. Ich/Stephan habe von dieser internen C++ CompilerVersion gesprochen.
    Siehe
    _MSC_VER = 500 -> C Compiler 5.x (DOS)
    _MSC_VER = 600 -> C Compiler 6.x (DOS)
    _MSC_VER = 700 -> ???
    _MSC_VER = 800 -> Visual C++ 1.0
    _MSC_VER = 900 -> Visual C++ 2.x
    _MSC_VER = 1000 -> Visual C++ 4.0
    _MSC_VER = 1100 -> Visual C++ 5.0
    _MSC_VER = 1200 -> Visual C++ 6.0
    _MSC_VER = 1300 -> Visual C++ 2002 (7.0)
    _MSC_VER = 1310 -> Visual C++ 2003 (7.1)
    _MSC_VER = 1400 -> Visual C++ 2005 (8.0)
    _MSC_VER = 1500 -> Visual C++ 2008 (9.0)
    _MSC_VER = 1600 -> Visual C++ 2010 (10.0)
    _MSC_VER = 1700 -> Visual C++ 2011 (11.0) ????



  • Danke.

    Na super. Sprich wenn ich nun die IP Adresse auf Richtigkeit überprüfen will muss ich nun auf eine andere Bibliothek zurückgreifen. Am besten wahrscheinlich auf boost.


  • Mod

    Nö. Es gibt ja inet_addr:
    http://msdn.microsoft.com/en-us/library/ms738563(VS.85).aspx
    Das ist weitaus mächtiger und Du kannst die Werte hinterher einfacher prüfen als mit diesem komplexen regex Ausdruck.
    Ich fände dies auch einfacher im Code zu lesen.

    Das Problem ist sicherlich der Bug an sich, dass repetitions nichtkorrekt behandelt werden.

    BTW: Du kannst Dich gerne mit dem Bezug auf den Connect-Bug an den MS Support wenden. Evtl. bekomst Du einen Hotfix!



  • Hallo.

    Danke für den Tipp. Das mit dem inet_addr wäre ja nicht schlecht. Das Problem ist nur dass keine IP Adresse sondern nur eine Art IP Adresse ist die ich überprüfe. Nennt sich NetID hat 2 Stellen mehr. IPV6 wäre dann ne Alternative. Da gäbe es ja dann die Funktion RtlIpv6StringToAddress(). Wenn die dann nicht nur für Vista aufwärts wäre. Verwenden hier immer noch XP. 😞



  • Eine IPv6 Adresse sieht *ganz* anders aus als eine IPv4 Adresse.
    Wenn deine NetID also ähnlich wie eine IPv4 Adresse aussieht, dann wirst du eine IPv6-Parser-Funktion ziemlich sicher nicht verwenden können um die NetID auf Gültigkeit zu prüfen.


  • Mod

    Dennoch: Einen Parser für so etwas zu bauen, der 6 Werte so herauszieht, die durch Punkt getrennt sind, ist ein Klax.

    PS: Ich will den Fehler nicht herunterreden, ich finde ihn auch heftig.



  • Dennoch: Einen Parser für so etwas zu bauen, der 6 Werte so herauszieht, die durch Punkt getrennt sind, ist ein Klax.

    Ok gebe ich dir recht. Dachte halt für genau so was nimmt man reguläre Asudrücke statt nen Parser.

    Was spricht den gegen Reguläre Ausdrücke (Ausser natürlich dieser Fall mit dem Bug).


  • Mod

    Dine Prüfungen auf die erlaubten Werte paare wird weitaus übersichtlicher und verständlicher sein. 😉



  • Ja mag sein. Aber auch aufwändiger (auch wenns ein "Klax" ist) und mehr Codezeilen.



  • Wobei man dann bei den einzelnen Abschnitten auch überprüfen muss ob diese gültige Werte enhalten. Hier würde ich dann auch regex benutzen. Oder gibts da auch ne bessere Lösung? IsNumeric oder so?


  • Mod

    Mit strtoul ist das doch total easy.
    http://msdn.microsoft.com/en-us/library/aa273010(VS.60).aspx

    - Du hast Deine x int-Felder, oder einen Array
    - Führst strtoul aus und bekommst den Zeiger auf den Punkt,oder das Zeichen durch das die Konvertierung beendet wurde.
    - Rückgabe Wert auf Overflow prüfen!
    - Prüfst auf den Punkt und weiter gehts, mit dem nächsten Feld.

    Das kann man auch easy und geschickt in eine Loop packen.

    Am Ende hast Du Deine x Werte und prüfst was in jedem einzelnen Segment erlaubt ist.

    Ich bezweifle, dass dies wirklich mehr Codezeilen sind.


Anmelden zum Antworten