2014-12-30 13 views
3

C에서 ++를 사용하여 여러 구분 기호로 문자열을 분할하는 방법을 찾고 있는데, 출력에서 ​​구분 기호를 잃지 않고 순서대로 분할 된 부분으로 구분 기호를 유지합니다 :구분 기호로 C++ 분할 문자열 및 결과에서 구분 기호를 유지

입력

AAA, bbb.ccc, DDD-EEE;

출력

AAA, BBB. ccc, ddd-eee;

나는 C#이나 java에서 C++ 솔루션을 찾고있다. 부스트를 사용하지 않는 것이 좋다.

답변

9

regex_iterator의 예제 위에 솔루션을 빌드 할 수 있습니다. 예를 들어, 당신이 알고있는 경우 구분 기호는 쉼표, 마침표, 세미콜론, 하이픈, 당신은 분리 또는 비 분리의 일련의 중 하나를 캡처하는 정규식 사용할 수 있습니다

([.,;-]|[^.,;-]+) 

드롭하는 샘플 코드에 당신은 something like this로 끝날 :

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

int main() 
{ 
    // the following two lines are edited; the remainder are directly from the reference. 
    std::string s ("aaa,bbb.ccc,ddd-eee;"); 
    std::regex e ("([.,;-]|[^.,;-]+)"); // matches delimiters or consecutive non-delimiters 

    std::regex_iterator<std::string::iterator> rit (s.begin(), s.end(), e); 
    std::regex_iterator<std::string::iterator> rend; 

    while (rit!=rend) { 
    std::cout << rit->str() << std::endl; 
    ++rit; 
    } 

    return 0; 
} 

시도가 당신이 좋아하는 다른 정규 표현식으로 대체.

3

귀하의 경우, 첫 번째 입력란을 제외하고 단어 경계 \b에 따라 입력 문자열을 분할하면 원하는 출력이 제공됩니다.

(?!^)\b 

DEMO

또는

DEMO

  • (?<=\W)(?!$)

    (?<=\W)(?!$)|(?!^)(?=\W) 
    

    는 비 단어 문자 옆에있는 경계 있지만 마지막에 경계 선물을 일치시킵니다.

  • | 또는

  • (?!^)(?=\W)

    은 시작에서 제외한 비 단어 문자 뒤에 경계를 일치합니다.

필요한 경우 백 슬래시를 한 번 더 이스케이프 처리하십시오.

+0

처리되지 않은 예외 오류로 인해 어떤 이유로 든 작동하지 않습니다. 여분의 백 슬래시를 추가하려고 시도했지만 도움이되지 않습니다. VS2013을 사용하고 있습니다. – Loki