regex_token_iterator — std::regex_token_iterator

regex_token_iterator — std::regex_token_iterator

std::regex_token_iterator는 **정규식의 모든 매치에 대해 개별 부분 일치(sub-match)에 접근하는 읽기 전용 정방향 반복자(ForwardIterator)**예요. C++11에서 도입됐어요. <regex> 헤더에 있어요.

일치 부분이나 캡처 그룹을 "토큰"처럼 순회하는 데 사용해요.

출처: cppreference

본문

// <regex> 헤더, C++11
template<
    class BidirIt,
    class CharT = typename std::iterator_traits<BidirIt>::value_type,
    class Traits = std::regex_traits<CharT>
> class regex_token_iterator;

사용 예 — 토큰화

#include <regex>
#include <iostream>

// 구분자로 토큰 나누기 (음수 = 토큰이 아닌 부분)
std::string s = "apple,banana,cherry";
std::regex sep(",");

// 일치하지 않는 부분(토큰) 순회: 인덱스 -1
for (auto it = std::sregex_token_iterator(s.begin(), s.end(), sep, -1);
     it != std::sregex_token_iterator{}; ++it) {
    std::cout << "[" << *it << "]\n";   // [apple] [banana] [cherry]
}

캡처 그룹 선택

네 번째 인자로 캡처 그룹 인덱스를 지정할 수 있어요.

std::string s2 = "a=1, b=2, c=3";
std::regex re2(R"((\w)=(\d))");

// 두 번째 캡처 그룹(숫자)만 순회
for (auto it = std::sregex_token_iterator(s2.begin(), s2.end(), re2, 2);
     it != std::sregex_token_iterator{}; ++it) {
    std::cout << *it << ' ';   // 1 2 3
}

특징

  • regex_iterator와 비슷하지만, 전체 매치가 아니라 특정 부분(서브매치)만 순회해요.
  • 인자로 -1을 주면 일치하지 않는 조각(구분자 분리 토큰)을 얻어요.
  • 여러 인덱스(벡터)를 넘기면 해당 그룹들을 순서대로 방문해요.
// 여러 캡처 그룹 선택
std::vector<int> idx{1, 2};
for (auto it = std::sregex_token_iterator(s2.begin(), s2.end(), re2, idx);
     it != std::sregex_token_iterator{}; ++it) {
    std::cout << *it << ' ';   // a 1 b 2 c 3 (그룹1, 그룹2 번갈아)
}

regex_token_iterator는 CSV·구분자 문자열을 토큰화하거나, 매치의 특정 그룹만 추출하는 작업에 이상적이에요.

더 알아보기 (Learn more)

cppreference