Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[regex] Problem przy dwóch szablonach

Ostatnio zmodyfikowano 2018-10-11 22:22
Autor Wiadomość
pawajoro
Temat założony przez niniejszego użytkownika
[regex] Problem przy dwóch szablonach
» 2018-10-10 22:58:05
Mam taki oto fragment kodu...
C/C++
while( !tel.eof() )
{
    do
    {
        getline( tel, help1 );
        telstr.append( help1 );
    } while( telstr.find( "trasa:" ) == string::npos );
   
    regex templ( "\\d+\\) [A-Z]{3} (\\d{5}/?\\d?); ID zam.: (\\d+); rel.: [\\w -ŁŻąćęłńóśżź]+ - [\\w -ŁŻąćęłńóśżź]+; kursuje: ([[:print:]]+); trasa:" );
    smatch res;
    string strres[ 3 ];
    bool regerr = false;
    while( telstr.find( "trasa:" ) != string::npos && !regerr )
    {
        if( regex_search( telstr, res, templ ) )
        {
            regerr = false;
           
            strconv( res, strres );
            telstr.erase( 0, telstr.find( strres[ 0 ] ) + strres[ 0 ].size() );
            cout << "Wyrazenie:" << strres[ 0 ] << '\n';
            cout << "Numer:" << strres[ 1 ] << '\n';
            cout << "ID:" << strres[ 2 ] << '\n';
            cout << "Kursowanie:" << strres[ 3 ] << '\n';
            help1 = "wejscie\\RJ_SKRJ_";
            help1 += strres[ 2 ];
            help1 += "_";
            help1 += strres[ 1 ];
            if( strres[ 1 ].size() == 7 )
                 help1.replace( help1.size() - 2, 1, "_", 1 );
           
            help1 += ".pdf";
            help2 = "wyjscie\\";
            help2 += filename;
            help2.erase( help2.size() - 4, 4 );
            help2 += "\\";
            help2 += strres[ 1 ];
            help2 += " - ";
            help2 += strres[ 3 ];
            help2 += ".pdf";
            if( CopyFile( help1.c_str(), help2.c_str(), TRUE ) == 0 )
                 cout << "Blad kopiowania pliku: " << help1 << " -> " << help2 << endl << "Opis bledu: " << GetLastError() << endl << endl;
            else
                 cout << "Skopiowano pomyslnie: " << help1 << " -> " << help2 << endl << endl;
           
            help1.clear();
            help2.clear();
            cout << "???";
        }
        else
        {
            regex tempel2( "(\\d+\\) [A-Z]{3} \\d{5}/?\\d?)( \\(\\d{4}\\))(; ID zam.: \\d+; rel.: [\\w -ŁŻąćęłńóśżź]+ - [\\w -ŁŻąćęłńóśżź]+; kursuje: [[:print:]]+; trasa:)" );
            smatch res2;
            if( regex_search( telstr, res2, tempel2 ) )
            {
                help1 = res2[ 2 ];
                telstr.replace( telstr.find( help1 ), help1.size(), "" );
                help1.clear();
            }
            else
            {
                cout << "Blad regex!" << endl;
                getchar();
                regerr = true;
            }
        }
    }
I wszystko jest w sumie pięknie... do czasu aż dojdzie to tego fragmentu tekstu (nieistotny fragment wyciąłem "[...]")

Dane techniczne - Pojazd trakcyjny: 14WE; Obciążenie: 165; Dł. poc.: 68
100) RMJ 44858 (2802); ID zam.: 1118974; rel.: Bohumin - Katowice; kursuje: 21.VIII-31.VIII ; trasa: Bohumin 08:38,0; Chałupki (Gr) 08:41,0; [...] Katowice 10:35,0 (+8);
Dane techniczne - Pojazd trakcyjny: EN57; Obciążenie: 138; Dł. poc.: 64; Wym. %m. ham: 94;
101) ROJ 94410/1; ID zam.: 1118584; rel.: Bielsko-Biała Główna - Racibórz; kursuje: 21.VIII-31.VIII w (A); trasa: Bielsko-Biała Główna 04:42,0 (-9); Bielsko-Biała Północ 04:44,0/04:44,5 (-9,1);
Przy pozycji 100 regex z szablonu "templ" słusznie nie znajduje wzorca (bo jest dodatkowy nawias). Wtedy do akcji wkracza tempel2 i znajduje wersję z nawiasem. Usuwa nawias i zaczynamy zabawę od nowa. templ słusznie znajduję już "poprawioną" pozycję nr 100 i wykonuje wszystkie czynności. Dochodzi do pozycji 101 i... nie znajduje niczego. I absolutnie nie mam pomysłu dlaczego. Testowałem na regex101.com i na pozycji 101 działa bez zarzutu. Jakby użycie tempel2 powodowało, że templ będzie później do użycia tylko raz. Ale dlaczego? To zachowanie absolutnie nie mogę w żaden sposób uzasadnić. Co jest nie tak?
P-172586
pekfos
» 2018-10-11 22:22:29
P-172588
« 1 »
  Strona 1 z 1