Frage zu boost::smtach!



  • Also da ich mir auch die boost - Library gezogen habe um die Funktionältät eies Linux - Shellscripts (awk/sed - Skripts) nach Windows zu portieren!
    Bin ich durch manche Beiträge auf boost gestossen und habe mir das Ding gleich in meine DevCPP - Umgebung installiert. Was auch alles doll funzt.

    Da mein Programm mit Regulären Ausdrücken arbeitet fand ich dies sehr interessant
    und ich habe hier mal nach anderen Beiträgen gesucht.
    Habe folgendes gefunden:
    [url]
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-61159-and-highlight-is-regex.html
    [/url]

    Besagter User will dort nach ner Netzwerkaddresse mit
    zusätzlicher Portnummer scannen!
    Habe besagten regulären Ausdruck mal zusammengebastelt, sieht etwa so aus

    //xxx.xxx.xxx.xxx:xxxxx gesucht und geparst wird nach Zahlen die so aufgebaut //sind soll sicher ne IP + Portnummer sein
        boost::regex re("([1-9][0-9]{2}\.[1-9][0-9]{2}\.[1-9][0-9]{2}\.[1-9][0-9]{2}:[1-9][0-9]{3})"); // funzt
    

    Wiegesagt das is noch nicht mein Problem oder Frage, da mein Programm auch compiliert und erwartungsgemäss das erhoffte Ergeniss ausgibt!
    An besagten Quelltext hab ich auch mitgeschnitten das das/die gefunden Muster in einem Objekt vom Typ

    boost::smtach
    

    abgelegt werden.
    Besagtes Objekt wurde nun so

    boost::smatch what;
    

    instanziert da dieses Objekt dann aber über einen Index mittels des Indexoperators angesprochen wird, gehe ich davon aus das diese Klasse eine
    Art Vector ist ähnlich des Vektortypes in der STL!

    Aber warum steht gerade das gefunden Muster wie in dem Beispiel am Index mit der
    Nummer 1 wieso nicht an Position 0? (habe jetzt nicht ausprobiert was rauskommt
    wenn ich bei mir statt 1 ne 0 einsetze!) siehe:

    boost::smatch what;
        if(boost::regex_search(line, what, re))
        {
            if(what[1].matched)
            {
                value = what[1];
                return true;
            }       
        }
        return false;
    

    Und wenn das so ist das das Objekt boost::smatch ne Art Vector ist kann man dann auch abfragen wie viele Elemente enthalten sind (gefunden worden sind)?
    So etwa:

    int smatch_count = what.size();
    // oder
    smatch_count = what.size;
    

    Grundlegend möchte ich also wissen welche Möglichkeiten bietet mir die Klasse
    boost::smatch

    Mit freundlichen Grüssen sclearscreen 🙂
    Thanks schon mal 👍



  • Hi,

    boost hat ne umfangreiche referenz. Schau da einfach rein. Da steht auch wie das resultset belegt wird.



  • hmm jo erstma danke wegen der Antwort habs gefunden!

    Habe an besagter Stelle folgendes gefunden.

    es gibt also wirklich ne Memberfunktion namens :

    size_type size()const;
    

    folgendes steht dort
    *Effects: Returns the number of sub_match elements stored in this; that is the number of marked sub-expressions in the regular expression that was matched plus one.

    Wenn ich richtig interpretiere stehen also in diesem Objekt dann wirklich alle gefunden Patterns. Und dies kann man über besagte Memberfunktion abfragen. Und wenn ich weiter richtig verstehe wird dort wenn was gefunden wurde immer Eines mehr eingetragen?

    ...in the regular expression that was matched plus one

    😕 Wenn das so ist verstehe ich aber nicht den Sinn? Welche Bewandnis soll das haben?
    Wie erklärt sich das? 😕

    mfg sclearscreen 🙂



  • Wird halt so sein wie bei anderen regex auch.
    Nr 0 ist der komplette Match, Nr 1 der erste Submatch ...
    Kurt



  • okay also wenn das so ist, nun Hauptsaxche ist ich weiss erstma wie ich überprüfen kann ob überhaupt etwas gefunden wurde zum einen mittels:

    bool empty()const;
    

    bzw indem an über:

    if(what[1].matched)
    

    an dieser Indexposition sozusagen nen boolsches - Flag
    abfragt.

    Nun dieses Wissen reicht mir erstma um in meiner kleinen Anwendung weiter vorwärts zukommen! 😉

    nen schönen Abend noch 👍 🙂


Anmelden zum Antworten