[regex] Problem przy dwóch szablonach
Ostatnio zmodyfikowano 2018-10-11 22:22
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... 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? |
|
pekfos |
» 2018-10-11 22:22:29 |
|
« 1 » |