2013-01-16 2 views
1

간단한 케이스 (기본적으로 두 태그 사이에있는 텍스트를 찾으십시오)를 구현하려고합니다. 나는 줄 여러 줄 주석 (/ * */사이)에 대한 C++ 정규식 검색

/* 내 댓글 출력으로 1 */

/* 내 댓글 2 */

/* 내 댓글 3 */

을 싶어. 캡처 그룹을 1로 제한해야합니까? 문자열 Hello /* my comment 1 */ world에 내가 원하는 것을 얻을 수 있기 때문에 - */

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

int main(int argc, const char * argv[]) 
{ 
    std::string str = "Hello /* my comment 1 */ world /* my comment 2 */ of /* my comment 3 */ cpp"; 

    std::cmatch res; 
    std::regex rx("/\\*(.*)\\*/"); 

    std::regex_search(str.c_str(), res, rx); 

    for (int i = 0; i < sizeof(res)/sizeof(res[0]); i++) { 
     std::cout << res[i] << std::endl; 
    } 

    return 0; 
} 
+0

을 적용합니다. – Dariusz

답변

9

로 정량 *를 돌려 정규 표현식은 */ 발생으로 일치 확인 입술 [0] 포함/* 내 댓글 1 그것의 non-greedy 버전. 다음과 같이 물음표를 추가하면됩니다.

std::regex rx("/\\*(.*?)\\*/"); 
+0

도움을 주신 덕분에 - 8 분 쿨 다운 이후에만 받아 들일 수있는 이상한 새로운 규칙으로 인해 일부 정규식 엔진의 경우 – asdf

+2

, 줄 바꿈과 일치하는'.'의 경우에도 다음과 같이 변경할 수 있습니다 :'[\ s \ S ]'그리고 나서 개행과 일치 할 것입니다. 그래서 파이썬에서는'multi_line_comment = re.compile (r "/ \ * ([\ s \ S] *?) \ */\ s *", re.MULTILINE)' – phyatt

0

패턴이 하나의 주석 인스턴스와 일치합니다. 그것들을 모두 잡으려면 이전에 일치 된 부분의 끝에서 시작하여 루프에서 regex_search를 수행해야합니다.

편집 :

은 먼저 당신이 지금 받고있는 것을 쓰기, 질문을 명확히하기 위해 존의 추천