Błąd w regex

0

mam ciąg It's a book.
oraz regex (a|an|the)\s+[A-Za-z]+
Uzywam std::sregex_iterator i znajduje mi:

1st match: a book
2st match: a

Nie wiem dlaczego i jak się pozbyć tego drugiego wyniku 'a'

1

no wszystko się zgadza. To drugie zwraca to co zostało złapane przez nawiasy.
Jakbyś pokazał kod to byłoby to oczywiste, a tak to tylko zgaduje, że po prostu nie rozumiesz co to jest 2nd match
Ty drukujesz informacje o detalach jednego dopasowania.

0
#include <iostream>
#include <string>
#include <regex>

int main()
{


	std::string source = "It's a book.";
	

	std::regex syntax("(a|an|the)\\s+[A-Za-z]+");

	

	

    std::cout << source << std::endl;

    std::sregex_iterator iter(source.begin(), source.end(), syntax);
    std::sregex_iterator end;

    while(iter != end)
    {
		std::cout << iter->size();
        for(unsigned i = 0; i < iter->size(); ++i)
        {
            std::cout << "the " << i + 1 << "th match" << ": " << (*iter)[i] << std::endl;
        }
        ++iter;
    }

	while(true)
	{}

}

Mój kod. Dlaczego iter->size() = 2 ?

1

No i jest dokładnie jak napisałem.
Iterator porusza się po kolejnych dopasowaniach całego wyrażenia regularnego (masz jedno dopasowanie).
Natomiast ty wypisujesz detale dopasowania każdego dopasowania.
Ty masz jedno dopasowanie z dwoma "detalami": pod indeksem zero jest dopasowanie całego wyrażenia regularnego, pod jedynką dopasowanie do pierwszej grupy z wyrażenia regularnego (to co w nawiasach), więcej grup nie masz w tym wyrażeniu regularnym.

0

http://ideone.com/08MLHp

#include <iostream>
#include <string>
#include <regex>
 
int main()
  {
   std::string source="It's a book.";
   std::regex syntax("(a|an|the)\\s+[A-Za-z]+");
   for(std::sregex_iterator end,i(source.begin(),source.end(),syntax);i!=end;++i)
     {
      std::cout<<i->str()<<std::endl;
     }
   return 0;
  }
0

tu masz lepszy przykład pokazujący słabość twojego wyrażenia regularnego:
http://ideone.com/Pw4nw9

1 użytkowników online, w tym zalogowanych: 0, gości: 1