C++ std::regex -keinoilla pitäisi etsiä esimerkiksi : merkkien ja ; merkkien välinen alue, jossa voi olla rivinvaihtojakin välissä. Ongelma näyttää olevan, että jotenkin pitäisi saada etsittävän merkkijonon loppukohta toimimaan.
Kokeiltu on esimerkiksi seuraavan ohjelman avulla
#include <fstream>
#include <iostream>
#include <string>
#include <regex>
#include <iterator>
// tiedostonimi ohjelmaparametrina
int main (int argc, char** argv)
{
std::ifstream ifs(argv[1]);
std::string s( (std::istreambuf_iterator<char>(ifs) ), (std::istreambuf_iterator<char>() ) );
//std::regex re(":(.*|\n)*\\p"); // alue : ..... p, ensimmäinen : ja viimeinen p, toimii
std::regex re(":(.*|\n)*\\;"); // alue : ..... ;, ensimmäinen : ja viimeinen ;, ei toimi ?????????
std::regex_token_iterator<std::string::iterator> ite( s.begin(), s.end(), re );
std::cout << std::endl << (*ite) << std::endl;
return 0;
}
// käännöskomento oli
// g++ testi02.cpp -o testi02 -std=c++17 -Wall -pedantic
Jos loppumerkkinä on vaikka p, ohjelma näyttää toimivan niin, kuin pitääkin. Mutta ; ei käy loppumerkkinä ja ohjelma jää luultavasti silmukkaan. Kokeilussa on käytetty tässä alla olevaa pientä tekstitiedostoa
ååå <a> löytyy tämä </a> :: <table> tällainen
qqqq
>zc jh äää
./testi01 testitiedosto.teksti 'y(.*|\n)*Å' -komennolla tehty ;;
ei löydy </table> ÅÅ ÅÅ loppu
Tiedosto on ehkä vähän hassun näköinen, mutta sillä on helppo kokeilla esimerkiksi å -alkuisia ja Å -loppuisia regexejä, jotka näyttävät toimivan. Mutta <table> ja </table> väliä en ole ainakaan toistaiseksi onnistunut saamaan.
Kun ohjelamatiedoston nimi on ollut testi02 ja syötetiedoston nimi on ollut testitiedosto.teksti, olen kokeillut komennolla
./testi02 testitiedosto.teksti
Käännöskomento on ollut
g++ testi02.cpp -o testi02 -std=c++17 -Wall -pedantic
: ja ; -merkkien välisen alueen hakeminen ei vain näytä onnistuvan
Muokk.
Jos
std::regex re(":(.*|\n)*p");
määrittelyn muuttaa muotoon
std::regex re(":(.|\n)*p");
ohjelma luultavasti toimii pikakokeilujen perusteella, ei 100% varmuutta.