2014-10-12 12 views
11

Czy jest jakaś różnica między regex_token_iterator a regex_iterator?Jaka jest różnica między regex_token_iterator a regex_iterator?

Wygląda na to, że obaj wykonują tę samą pracę, ale nie są pewni, która z nich jest lepsza?

+1

Jeśli odpowiedź @ ShafikYaghmoura rozwiązała Twój problem, zaakceptuj go. Osobiście uważam, że jest to bardzo dobra odpowiedź. –

Odpowiedz

11

Tam jest rzeczywiście różnica między nimi, jeśli spojrzymy na cppreference opisuje std::regex_iterator następująco:

std :: regex_iterator jest tylko do odczytu ForwardIterator że dostęp do poszczególnych meczów wyrażenia regularnego wewnątrz instrumentu bazowego sekwencja znaków.

i std::regex_token_iterator jak:

std :: regex_token_iterator jest tylko do odczytu ForwardIterator że dostęp poszczególne podgrupy mecze każdym meczu wyrażenia regularnego w ramach podstawowej sekwencji znaków. Może być również używany do uzyskiwania dostępu do części sekwencji, które nie były dopasowane przez dane wyrażenie regularne (np. Jako tokenizator).

Więc std::regex_token_iterator pozwala również dopasować non-dopasowane tokeny lub sub-wyrażenie n-th.

Sekcja cppreference dla std::regex_token_iterator że połączone powyżej opisuje typową realizację następująco:

Typowa implementacja std :: regex_token_iterator posiada podstawowej std :: regex_iterator, pojemnik (np std :: wektor) z żądanych indeksów submatch, wewnętrzny licznik równy indeksowi podtypu, wskaźnik do std :: sub_match, wskazujący na bieżący podtyp bieżącego dopasowania oraz obiekt std :: match_results zawierający ostatnia nie dopasowana sekwencja znaków (używana w tokenizerze ).

Książka The C++ Standard Library wyjaśnia w 14.4Regex Token iteratory następująco:

regex iterator pomaga iteracyjne nad dopasowane podsekwencje. Jednak czasami trzeba także przetworzyć całą zawartość między dopasowanymi wyrażeniami . [...] Ponadto, można określić listę integralnych wartości, które stanowią elementy „tokeny”:

  • -1 oznacza, że ​​jesteś zainteresowany wszystkich podciągów między dopasowanych wyrażeń regularnych (żeton separatory).
  • 0 oznacza, że ​​jesteś zainteresowany wszystkimi dopasowanymi wyrażeniami regularnymi (separatorami tokenów).
  • Każda inna wartość n oznacza, że ​​interesuje Cię pasujące n-ty podwyrażenie wewnątrz wyrażeń regularnych.

Witryna książki zapewnia przykładowy kod dla sregex_token_iterator i sregex_iterator, który powinien być również pomocne.

Powiązane problemy