문제

나는 주석을 자동으로 건너뛰면서 특정 문자열을 검색할 수 있는 정규식을 찾으려고 노력해 왔습니다.이와 같은 RE를 갖고 있거나 알고 있는 사람이 있나요?건너뛸 만큼 정교할 필요도 없습니다. #if 0 블록;그냥 건너뛰었으면 좋겠어 // 그리고 /* 블록.주석 블록 내부만 검색하는 반대의 경우도 매우 유용합니다.

환경:VS 2003

도움이 되었습니까?

해결책

문자열 내부의 주석 토큰, 자체적으로 주석 처리된 주석 토큰 등을 고려해야 하기 때문에 처음에 나타나는 것보다 더 어려운 문제입니다.

저는 C#용 문자열 및 주석 파서를 작성했습니다. 도움이 될만한 내용을 찾아보겠습니다...뭔가 발견하면 업데이트하겠습니다.

편집하다:...좋아, 그래서 내 오래된 'codemasker' 프로젝트를 찾았습니다.단일 정규식을 사용하지 않고 단계적으로 이 작업을 수행한 것으로 나타났습니다.기본적으로 시작 토큰을 찾기 위해 소스 파일을 조금씩 살펴보고, 하나를 찾으면 끝 토큰을 찾고 그 사이의 모든 것을 마스킹합니다.이는 시작 토큰의 컨텍스트를 고려합니다..."문자열 시작"에 대한 토큰을 찾으면 문자열 끝을 찾을 때까지 주석 토큰을 ​​안전하게 무시할 수 있으며 그 반대의 경우도 마찬가지입니다.코드가 마스크되면(Guid를 마스크로 사용하고 해시테이블을 사용하여 추적함) 안전하게 검색 및 교체를 수행한 다음 마지막으로 마스크된 코드를 복원할 수 있습니다.

도움이 되길 바랍니다.

다른 팁

문자열에는 특히 주의하세요.문자열에는 종종 문자열의 끝을 찾는 동안 존중해야 하는 이스케이프 시퀀스가 ​​있습니다.

예를 들어 "This is \"a test\"".맹목적으로 큰따옴표를 찾아 종료할 수는 없습니다.또한 "이것은 \"입니다. 이는 "큰따옴표 앞에 백슬래시가 오지 않는 한"이라고만 말할 수 없음을 나타냅니다.

요약하면, 잔인한 단위 테스트를 해보세요!

정규 표현식은 작업에 가장 적합한 도구가 아닙니다.

펄 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;

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top