2012-10-27 4 views
1

나는 C++ 용 템플릿 엔진과 비슷한 것을 연구 중이다. 표준 <regex> 라이브러리를 사용하면 AB $1 BA (AB의 이스케이프 문자 (예 : \AB)과 작동하지 않지만 AB 이전의 다른 문자와 함께 작동 함)이 패턴 인 문자열에서 여러 일치 항목을 찾은 다음 일치 항목을 문자열 벡터? 예를 들어정규식 문자열을 1 개의 변수로 바꾸려면 어떻게해야합니까?

:

string main_string = "Something cool \AB blabla BA, something else AB first BA, something AB second BA more."; 
vector<string> matches; 
// algorithm here 

과 일치 firstsecond을 포함해야합니다.

답변

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

int main() { 
    std::string target_text(
     "Something cool \\AB blabla BA, something else AB first BA, " 
     "something AB second BA more."); 
    std::vector<std::string> result; 
    typedef std::string::const_iterator iter_type; 
    std::regex rgx("[^\\\\]AB(.*?)BA"); 
    std::regex_iterator<iter_type> iter(target_text.begin(), 
             target_text.end(), 
             rgx); 
    std::regex_iterator<iter_type> end; 
    for (; iter != end; ++iter) 
     result.push_back((*iter)[1].str()); 
    for (int i = 0; i < result.size(); ++i) 
     std::cout << result[i] << '\n'; 
    return 0; 
} 

정규 표현식이 올바르지 않습니다. 나머지 패턴 바로 전에 한 문자 (백 슬래시가 아님)를 사용하기 때문에 "ABcBA"과 일치하지 않습니다. 그것은 캐릭터 그룹 대신에 부정적인 주장으로 고칠 수 있지만, 시도한 간단한 테스트는 효과가 없었고 지금은 더 많은 시간을두고 싶지 않습니다.

관련 문제