Regex übereinstimmung in Textdatei suchen



  • Ich möchte mit einen beliebigen Regulären Ausdruck durch eine Datei gehen und nach einer übereinstimung suchen. Wie lese ich am besten die Datei damit auch jede übereinstimmung gefunden wird?



  • pppp schrieb:

    Ich möchte mit einen beliebigen Regulären Ausdruck durch eine Datei gehen und nach einer übereinstimung suchen. Wie lese ich am besten die Datei damit auch jede übereinstimmung gefunden wird?

    hi,

    erstmal, dateien kannst du mit "fstream" einlesen und auch wiederschreiben...
    http://www.cplusplus.com/doc/tutorial/files/

    dann solltest du dir überlegen ob du die datei zeilenweise oder zeichenweise einlesen willst, bzw. was mehr sinn macht. ... (wie der RegEx aussieht, was er suchen soll...)

    dann wäre die frage was willst du mit dem regex machen ein match , search oder replace? 🙄



  • Hallo, danke für die Antwort, mit fstream kenne ich mich schon aus, aber mit regex habe ich noch nicht viel gemacht. Es geht darum das mein Programm in einer Datei nach einen bestimmten Begriff sucht:

    program --search "c++" --file test.text
    

    Nun möchte ich meinen Programm beibringen Regulären Ausdrücke zu lesen:

    program --regex --search "[0-9][a-z]" --file test.text
    

    Meine Frage ist wie ich die Datei am besten einlesen soll:

    while( getline( file, buffer ) )
    {
        if( boost::regex_match(buffer, boost::regex(Text) )
        {
            //////
        }
    }
    

    Gibt es eine boost::regex Funktion die untersucht ob in dem gesamten Text ein Match enthalten ist ? Oder wie lese ich die Datei am besten ein damit auch jede Übereinstimmung gefunden wird ?



  • Kannst Du nicht ganz einfach eine Zeile nach der anderen lesen und untersuchen? Alternativ könnte man die ganze Datei einlesen (hängt natürlich von der Größe ab) und untersuchen ...



  • Lies doch einfach die gesamte Datei ein. Wenn du die gesamte Datei hast, kann ja nichts fehlen.

    string content( (istreambuf_iterator<char>(file)), (istreambuf_iterator<char>()) );
    

    Im nächsten Schritt gehst eben mit regex drüber. Brauchst auch kein boost, nimmst std.



  • Wenn ich die Datei zeilenweise einlese also so:

    while( std::getline( file, buffer ) )
            {
                if( searchOptions & options::regexMatch )
                {
                    if( boost::regex_match(buffer, boost::regex(searchTerm) ) )
                    {
                        std::cout << "file: " << filePath << " -> line: " << line << "\n";
                    }
                }
    

    Findet er bei [0-9] nur Zeilen wie: 2432
    Besteht die Zeile aber aus: Zahl 2432 erkennt er die Zeile natürlich nicht.

    Der Ausdruck kann aber auch Das Wetter ist (toll|richtig schlecht) heißen. Deswegen ist Wort für Wort lesen auch nicht das richtige.



  • pppp schrieb:

    Hallo, danke für die Antwort, mit fstream kenne ich mich schon aus, aber mit regex habe ich noch nicht viel gemacht. Es geht darum das mein Programm in einer Datei nach einen bestimmten Begriff sucht:

    program --search "c++" --file test.text
    

    Nun möchte ich meinen Programm beibringen Regulären Ausdrücke zu lesen:

    program --regex --search "[0-9][a-z]" --file test.text
    

    Meine Frage ist wie ich die Datei am besten einlesen soll:

    while( getline( file, buffer ) )
    {
        if( boost::regex_match(buffer, boost::regex(Text) )
        {
            //////
        }
    }
    

    Gibt es eine boost::regex Funktion die untersucht ob in dem gesamten Text ein Match enthalten ist ? Oder wie lese ich die Datei am besten ein damit auch jede Übereinstimmung gefunden wird ?

    ist doch genau, richtig. -> nutz getline() -> ließt zeilenweise
    ich würde die datei zeilenweise einlesen, und dann immer pro zeile den regex los lassen. so kannst du dir falls gewünscht auch die zeile merken. (einfach einen counter mitlaufen lassen)

    so weit ich deinen code sehe müsste wenn den regex einen treffer findet, die if-abfrage greifen. alternativ könntest du auch über eine rückgabe des match arbeiten.



  • pppp schrieb:

    Findet er bei [0-9] nur Zeilen wie: 2432
    Besteht die Zeile aber aus: Zahl 2432 erkennt er die Zeile natürlich nicht.

    Ich kenn mich mit regulären Ausdrücken nicht aus, aber dann hast Du wohl einen Fehler in Deinem Suchpattern.



  • Belli schrieb:

    pppp schrieb:

    Findet er bei [0-9] nur Zeilen wie: 2432
    Besteht die Zeile aber aus: Zahl 2432 erkennt er die Zeile natürlich nicht.

    Ich kenn mich mit regulären Ausdrücken nicht aus, aber dann hast Du wohl einen Fehler in Deinem Suchpattern.

    ja , denke ich auch. das ist ein ungewöhnliches verhalten.

    std::string text="[0-9][a-z][A-Z]";
    
    while( getline( file, buffer ) )
    {
        if( boost::regex_match(buffer, boost::regex(Text) )
        {
            //////
        }
    }
    

    hast du "[A-Z]" auch benutzt?
    wie lautet dein Expression genau?



  • vll helfen dir diese beispiel auch weiter...
    es gibt auch seit c++11 im std::regex ...
    (matching funktioniert hier auch einwandfrei 🙂 ) ...
    ist vll auch etwas einfacher zu handhaben am anfang...

    dazu, schau dir das mal an:
    http://www.cplusplus.com/reference/regex/
    und
    http://www.cplusplus.com/reference/regex/regex_match/

    bei dem letzen link gibt es auch ein beispiel... da siehst du wie man soetwas normalerweise macht und was rauskommt 😉 ...


Log in to reply