[Boost] Wyrażenia regularne


(Marcinch7) #1

Hejka, mam problem - otóż muszę po raz pierwszy użyć wyrażeń regularnych...

Właściwie to problem dotyczy też po części biblioteki Boost ponieważ to z niej korzystam. Wrzucam mój kod:

#include 

#include 

#include 


int main() {


	boost::regex rep("pieczarki(.*)zupa");

	std::string line="pieczarkigrzybowazupa";


	boost::sregex_iterator begin(line.begin(), line.end(), rep);

	boost::sregex_iterator end;

	for(;begin!=end;++begin) std::cout << (*begin)[1] << std::endl << std::endl;


	std::cout << std::endl;

	std::system("pause");

    return 0;

}

Zaznaczam że wyrażenie pisałem kompletnie na pałę ponieważ się na nich nie znam.

Problem polega na tym, że przy stringu takim jak jest w kodzie - wszystko działa i program wypisuje na ekran "grzybowa", ale gdy stringa trochę skomplikuje np. "pieczarkigrzybowazupa pomidor pomidor pieczarkipomidorowazupa" to program wariuje, i zamiast wypisać "grzybowa pomidorowa" wypisuje kompletne bzdury. Proszę o pomoc :slight_smile:


(Sawyer47) #2

Kiedy dopasujesz o

pieczarkigrzybowazupa pomidor pomidor pieczarkipomidorowazupa

otrzymasz

grzybowazupa pomidor pomidor pieczarkipomidorowa

ponieważ operator powtórzenia zero lub więcej razy * działa zachłannie. Kiedy wyrażenie będzie na zaznaczonej pozycji nie przestanie pochłaniać kolejnych liter, ponieważ kropka pasuje również do dalszej części napisu. W ten sposób dojdzie z (.*) aż do drugiej zaznaczonej pozycji i wtedy dopasuje resztę, czyli "zupa"

pieczarkigrzybowazupa pomidor pomidor pieczarkipomidorowazupa

                     ^ ^

Ogólnie wyrażenia regularne to potężne narzędzie, ale trzeba poświęcić troszkę czasu na ich zrozumienie.


(Tomek Matz) #3

Do tego co napisał nr47 dodam tylko przykładowe rozwiązanie:

([^<]*)