2008-09-10 4 views
4

저는 자동으로 주석을 건너 뛰는 동안 특정 문자열을 검색 할 수있는 정규식을 찾으려고했습니다. 누구나이 같은 RE 또는 하나의 알고 있나요? 심지어 #if 0 블록을 건너 뛰기에 충분히 정교 할 필요도 없습니다. 그냥 ///* 블록을 건너 뛰고 싶습니다. 그 반대는 주석 블록 안에서만 검색하므로 매우 유용합니다.Regex의 개발자 용

환경 : VS 2003

답변

3

이 당신이 문자열 안에 주석 토큰을 ​​고려할 필요가 있기 때문에이 처음 나타날 것보다 더 열심히 문제, 주석 토큰 자체가 주석되는 등

내가 쓴 C#의 문자열 및 주석 파서, 도움이 될만한 것을 파헤쳐 볼 수 있는지 알아 보겠습니다. 찾으면 업데이트하겠습니다.

편집 : ... 오케이, 그래서 내 오래된 'codemasker'프로젝트를 찾았습니다. 내가 이것을 한 단 정규식으로하지 않고 단계적으로 수행했다는 것을 알게됩니다. 기본적으로 나는 시작 토큰을 찾는 소스 파일을 통해 인치 토큰을 찾은 다음 중간에 모든 것을 마스크합니다. 이것은 시작 토큰의 컨텍스트를 고려합니다 ... "문자열 시작"에 대한 토큰을 찾으면 문자열 끝을 찾을 때까지 주석 토큰을 ​​무시하고 그 반대의 경우도 안전하게 무시할 수 있습니다. 일단 코드가 가면 (나는 guids를 마스크로 사용하고 해시 테이블을 사용하여 추적합니다) 안전하게 검색 및 교체 한 다음 마스킹 된 코드를 복원 할 수 있습니다.

희망이 있습니다.

2

특히 문자열에주의하십시오. 문자열에는 대개 이스케이프 시퀀스가 ​​있으며, 이스케이프 시퀀스는 해당 시퀀스의 끝을 찾는 동안 존중해야합니다.

예. "This is \"a test\"". 맹목적으로 이중 인용문을 찾아서 종료 할 수는 없습니다. 또한 이것은 "\"이며 조심해야합니다. "큰 따옴표 앞에 백 슬래시가 오지 않는 한"이라고 말할 수 없다는 것을 보여줍니다.

요약하면, 잔인한 단위 테스트를하십시오!

1

먼저 사본을 만들고 주석을 제거한 다음 문자열을 일반적인 방법으로 검색합니다.

2

정규 표현식은 작업을위한 최상의 도구가 아닙니다.

Perl FAQ

:

C 코멘트 :

#!/usr/bin/perl 
$/ = undef; 
$_ = <>; 

s#/\*[^*]*\*+([^/*][^*]*\*+)*/|([^/"']*("[^"\\]*(\\[\d\D][^"\\]*)*"[^/"']*|'[^'\\]*(\\[\d\D][^'\\]*)*'[^/"']*|/+[^*/][^/"']*)*)#$2#g; 
print; 

C++ 주석 :

자주 묻는 질문 링크가 죽었다는
#!/usr/local/bin/perl 
$/ = undef; 
$_ = <>; 

s#//(.*)|/\*[^*]*\*+([^/*][^*]*\*+)*/|"(\\.|[^"\\])*"|'(\\.|[^'\\])*'|[^/"']+# $1 ? "/*$1 */" : $& #ge; 
print; 
+0

. 나는 그것이 [여기에] 옮겼다고 생각한다. (http://perldoc.perl.org/perlfaq6.html#How-do-I-use-a- regular-expression-to-strip-C-style-comments-from-a -file % 3f) –

+0

@Matt Mendell : 감사합니다. 링크를 업데이트했습니다. – jfs