
//
// To jest przykładowy kod z podrozdziału 23.8.7 „Błędy w wyrażeniach regularnych” książki
// "Programowanie. Teoria i praktyka z wykorzystaniem C++" Bjarne'a Stroustrupa.
//

#include <boost/regex.hpp>
#include <iostream>
#include <string>

using namespace std;
using namespace boost;

//------------------------------------------------------------------------------

void wrong_patterns()
{
    regex pat1("(|ghi)");    // brakuje alternatywy
    regex pat2("[c-a]");     // nie przedział
}

//------------------------------------------------------------------------------

// wzorzec i zestaw wierszy zostają przyjęte na wejściu,
// wzorzec zostaje sprawdzony i następuje wyszukanie odpowiadających mu wierszy.

int main()
{
    regex pattern;

    string pat;
    cout << "Wprowadź wzorzec: ";
    getline(cin,pat);        // wczytuje wzorzec

    try {
        pattern = pat;       // sprawdza pat
        cout << "Wzorzec: " << pattern << '\n';
    }
    catch (bad_expression) {
        cout << pat << " nie jest poprawnym wyrażeniem regularnym.\n";
        exit(1);
    }

    cout << "Wprowadź tekst:\n";
    string line;             // bufor wejściowy
    int lineno = 0;

    while (getline(cin,line)) {
        ++lineno;
        smatch matches;
        if (regex_search(line, matches, pattern)) {
            cout << "Wiersz " << lineno << ": " << line << '\n';
            for (int i = 0; i<matches.size(); ++i)
                cout << "\tpasuje[" << i << "]: "
                     <<  matches[i]  << '\n';
        }
        else
            cout << "nie pasuje\n";
    }
}

//------------------------------------------------------------------------------
