Ubuntu Suomen keskustelualueet

Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: teele - 03.06.19 - klo:12.04

Otsikko: [ ratkaistu ] c++ regex -kysymys
Kirjoitti: teele - 03.06.19 - klo:12.04
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

Koodia: [Valitse]
#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

Koodia: [Valitse]
ååå <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

Koodia: [Valitse]
./testi02 testitiedosto.teksti

Käännöskomento on ollut
Koodia: [Valitse]
g++ testi02.cpp -o testi02 -std=c++17 -Wall -pedantic
: ja ;  -merkkien välisen alueen hakeminen ei vain näytä onnistuvan :(

Muokk.

Jos
 
Koodia: [Valitse]
std::regex re(":(.*|\n)*p");
määrittelyn muuttaa muotoon
Koodia: [Valitse]
std::regex re(":(.|\n)*p");
ohjelma luultavasti toimii pikakokeilujen perusteella, ei 100% varmuutta.