2012-02-03 2 views
2

C++로 작업 한 이후로 꽤 오래되었습니다.하지만 제가 알 수있는 것부터 제 코드가 작동해야합니다. 코드를 포함하는 파일에서 모든 블록 주석을 대체/제거하려고합니다. 검색하는 전체 파일을 문자열에 넣었고 문자열에 줄 바꿈 문자가 포함되어 있습니다.왜이 정규식은 C++ TR1에서 작동하지 않습니까?

여기에 내가 말할 수있는이 여기에 새로운 라인을 포함에/* 아무것도 일치해야합니다 지금까지 내 코드

std::tr1::regex rx1("[/][*][\S\s]*?[*][/]"); 
stringName = std::regex_replace(stringName, rx1, std::string("")); 

입니다 */

나는 심지어 일치 http://gskinner.com/RegExr/, 그것을 테스트했습니다 주석을 완벽하게 차단하십시오. 문제는 블록 주석이 대체되지 않는다는 것입니다. 이것은 TR1 특정 버그입니까?

+2

백 슬래시를 이스케이프해야합니다. "\\" –

+0

'*? '는 유효합니까? 원하는만큼 자주 매치하지만 적어도 한 번 이상? 그것은'+'와 동일하지 않습니까? – RedX

+0

@RedX :'?'는'*'에 대한 욕심이없는 변경자입니다. –

답변

1

궤도의 경주는 오른쪽 경로를 따라 나를 밀었지만 *와? [] 괄호 안의 인수에는 사용할 수 없습니다. 이를 수행하는 방법은 또는 명령문이있는 비 캡처 그룹을 사용하는 것입니다. 멀티 라인 블록 주석을 찾을 수

코드 :

std::tr1::regex rx3("[/][*](?:\s|.|\n)*?[*][/]"); 

(? 표현) 각각 캡처 그룹을 만드는 방법이다. *와?를 적용 할 수 있습니다. 저것의 바깥쪽으로. 그 안에, | 또는 진술로

+0

'*?''tr1'의 구현이 아니라면 절대적으로 _can_ 문자 클래스에 적용 할 수 있습니다. _ 완전하게 바보 야. –

3

당신은 당신이하고있는 계층이 있다고 생각해야합니다.

  • 먼저 문자열 리터럴에 문자열을 만듭니다. 인간에게는 정규 표현식처럼 보이지만 문자열 리터럴은 상관하지 않습니다.

    문자열 리터럴은 다른 문자들 중에서도 \S\s과 같이 각각 특수 문자가 포함되어 있습니다 (\n은 특수 문자 임).

  • 그런 다음 — 특수 문자와 — 문자열을 정규식 엔진에 전달합니다.

    [/][*][\S\s]*?[*][/] 
    
    : 정규식 엔진이 다음 제대로 표현을 볼 수

    std::tr1::regex rx1("[/][*][\\S\\s]*?[*][/]") 
    

    :

대신, 당신은 단지 문자열 리터럴를 들어, 백 슬래시의 탈출 을 수행해야합니까


또한 tr1의 엔진에 구분 기호가 필요한지 확인합니다. 그들은 보통 좋은 생각입니다.

+0

또는 원시 문자열 리터럴을 사용할 수 있습니다 :'R "([/] [*] [?] [?] [/])"'이스케이프 시퀀스는 원시 문자열 리터럴 내에서 해석되지 않습니다. 초기 단계에서 일어나는 trigraphs, digraphs 및 UCN 해석조차도 원시 문자열 리터럴 내부에 _undone_입니다. 원시 문자열 리터럴은 정규식 또는 유사한 문자열과 여러 줄 문자열 리터럴을위한 것입니다. – bames53

+0

@ Bames53 : 그래, 또는 그. 그래도 삼부작은 어떻게 되나요? 전처리 기는 충분한 정보를 컴파일러에 전달합니다. –

+0

백 슬래시를 구분해야한다는 의미를 알 수 있습니다. 나는 그것을 잡았어야했다. 즉, 어떤 이유로 든 여전히 효과가 없다. [] 안에있는 것들에 * 함수를 사용할 수 있습니까? 나는 생각하지 않기 시작했고, msdn 사이트에서 어떤 방법이나 다른 예도 보지 못했습니다. 그렇지 않다면, 내가하려는 일을 말할 수 있습니다. 어떻게 내가 이것에 대해 갈 것이냐? – Brandon

관련 문제