문제
나는 주석을 자동으로 건너뛰면서 특정 문자열을 검색할 수 있는 정규식을 찾으려고 노력해 왔습니다.이와 같은 RE를 갖고 있거나 알고 있는 사람이 있나요?건너뛸 만큼 정교할 필요도 없습니다. #if 0
블록;그냥 건너뛰었으면 좋겠어 //
그리고 /*
블록.주석 블록 내부만 검색하는 반대의 경우도 매우 유용합니다.
환경:VS 2003
해결책
문자열 내부의 주석 토큰, 자체적으로 주석 처리된 주석 토큰 등을 고려해야 하기 때문에 처음에 나타나는 것보다 더 어려운 문제입니다.
저는 C#용 문자열 및 주석 파서를 작성했습니다. 도움이 될만한 내용을 찾아보겠습니다...뭔가 발견하면 업데이트하겠습니다.
편집하다:...좋아, 그래서 내 오래된 'codemasker' 프로젝트를 찾았습니다.단일 정규식을 사용하지 않고 단계적으로 이 작업을 수행한 것으로 나타났습니다.기본적으로 시작 토큰을 찾기 위해 소스 파일을 조금씩 살펴보고, 하나를 찾으면 끝 토큰을 찾고 그 사이의 모든 것을 마스킹합니다.이는 시작 토큰의 컨텍스트를 고려합니다..."문자열 시작"에 대한 토큰을 찾으면 문자열 끝을 찾을 때까지 주석 토큰을 안전하게 무시할 수 있으며 그 반대의 경우도 마찬가지입니다.코드가 마스크되면(Guid를 마스크로 사용하고 해시테이블을 사용하여 추적함) 안전하게 검색 및 교체를 수행한 다음 마지막으로 마스크된 코드를 복원할 수 있습니다.
도움이 되길 바랍니다.
다른 팁
문자열에는 특히 주의하세요.문자열에는 종종 문자열의 끝을 찾는 동안 존중해야 하는 이스케이프 시퀀스가 있습니다.
예를 들어 "This is \"a test\""
.맹목적으로 큰따옴표를 찾아 종료할 수는 없습니다.또한 "이것은 \"입니다. 이는 "큰따옴표 앞에 백슬래시가 오지 않는 한"이라고만 말할 수 없음을 나타냅니다.
요약하면, 잔인한 단위 테스트를 해보세요!
정규 표현식은 작업에 가장 적합한 도구가 아닙니다.
C 댓글:
#!/usr/bin/perl
$/ = undef;
$_ = <>;
s#/\*[^*]*\*+([^/*][^*]*\*+)*/|([^/"']*("[^"\\]*(\\[\d\D][^"\\]*)*"[^/"']*|'[^'\\]*(\\[\d\D][^'\\]*)*'[^/"']*|/+[^*/][^/"']*)*)#$2#g;
print;
C++ 주석:
#!/usr/local/bin/perl
$/ = undef;
$_ = <>;
s#//(.*)|/\*[^*]*\*+([^/*][^*]*\*+)*/|"(\\.|[^"\\])*"|'(\\.|[^'\\])*'|[^/"']+# $1 ? "/*$1 */" : $& #ge;
print;
나는 사본을 만들고 먼저 주석을 제거한 다음 일반적인 방법으로 문자열을 검색합니다.