2012-08-15 2 views
-2

나는 mulit-line c-style 주석으로 토큰을 찾아서 주석에서 제거하기 위해 정규 표현식을 쓰려고 노력하고있다. 위의 소스 파일 내에서 발견 될 때마다>정규식을 사용하여 특수 토큰의 주석 처리를 제거합니다 (/ * */스타일 주석 내에있는 경우에만). perl one-liner에서

/* 
* comments */ 
SpecialToken 
/** comments 
*/ 

-

/* 
* comments 
SpecialToken 
* commetns 
*/ 

예는 다음과 같은 변환을 수행 할 수.

내가 온라인을 발견 (http://ostermiller.org/findcomment.html) 일치/* */스타일의 주석에 대한 정규식 :

/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/ 

내 특별 토큰이 같은 것입니다 : n \ \ nSpecialToken는, 나는 다음을 얻을 수있는 이전 정규식 편집 :

perl -pi -e 'BEGIN{undef $/;} s/(\/\*(?:[^*]|[\r\n]|(?:\*+(?:[^*\/]|[\r\n])))*)\ncloneVerifierMarker_39843829489349873478202370870872077223082\n((?:[^*]|[\r\n]|(?:\*+(?:[^*\/]|[\r\n])))*\*+\/)/$1\*\/\ncloneVerifierMarker_39843829489349873478202370870872077223082\n\/\*$2/g' temp/file 
01 : 다음 주석에서 제거 펄 한 줄을 만들어
/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*cloneVerifierMarker_39843829489349873478202370870872077223082([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/ 

주석에서 토큰을 제거한다는 점에서 효과가 있지만 특수 토큰이 주석에없는 경우도 선택하는 것으로 보입니다. 예를 들어

두 SpecialToken 일단 주석 (라인 34)의 내부에 일단 온 (라인 2342)의 외측에, 그것을 주입 가지고 다음 파일 I는 펄를 실행 한 후

http://pastebin.com/Yq185G8g

http://pastebin.com/LYftGBX1

특수 토큰이 성공적으로 코멘트에서 제거되지만 두 번째 인스턴스는 여전히 주석에없는 경우에도 처리된다 -liner 나는 다음과 같은 얻을.

나는이 :(발생하는 이유를 모르겠습니다.

이 나는 ​​소스 코드의 변환에서 코드의 조각을 추적 할 필요가있다 내가 뭐하는 거지 이유. 이러한 변환은 주석을 제거 그렇다면 특수 토큰이 주석에서 제거되어야합니다.

도움을 주셔서 감사합니다 :).

+0

기본 목표를 설명해주십시오. 토큰 만 남기고 모든 주석을 제거하는 것으로 충분합니까? – Borodin

+1

RegEx가 과도한 것처럼 보입니다. 간단한 파서로이 작업을 수행 할 수 있습니다. – Kash

+1

이것은 사소한 문제가 생각의 혼란으로 어색하게 만든 것처럼 보입니다. 닫기 투표 – Borodin

답변

0

난 당신이 정규식을 찾고 있습니다 믿습니다

s/(\/\*)(?:(?!.*?\*\/.*?SpecialToken)(.*?)(SpecialToken)(.*?))(\*\/)/$1$2\*\/$3\/\*$4$5/gs; 

테스트 코드 here.

관련 문제