2010-02-02 2 views
0

내가 단어가 '사과'의 경우, 예를 들어 특정 단어를 가지고 모든 기능을 제거하면됩니다 좋아 :방법과 기능 코드 블록과 일치하는 정규 표현식

void eatapple() 
{ 
// blah 
// blah 
} 

내가 모든 코드를 삭제하고 싶습니다 'void'에서 '}'까지

^void.*apple(.|\n)*} 

하지만 뭔가 잘못 여기 생각 아주 오랜 시간이 걸렸 : 내가 시도하는 것입니다.

Visual Studio를 사용하고 있습니다. 고맙습니다.

답변

0

마지막으로 수행했습니다. 그것은 작동하지만, 그것은 매우 특정한 방식으로 포맷하는 코드에 따라 달라집니다

^void.*(a|A)pple\(\)\n\{\n((\t.*\n)|(^$\n))*^\} 
0

함수 블록은 정규 규칙이 아니므로이 경우 일반 표현식을 사용하는 것은 좋지 않습니다.

정말 많은 수의 함수를 삭제해야합니다. (코드베이스 —에 문제가 있음을 나타낼 수 있지만 더 이상 쓸모 없게 만들 수 있습니다.) 그렇다면 빠른 중괄호 계산 구문 분석기를 작성해야합니다 이 상황에서 정규 표현식을 사용하는 대신.

특히 중괄호가 이미 균형을 이룬 것으로 가정 할 수 있다면 꽤 쉽습니다. 토큰을 읽고 "사과"와 일치하는 것을 찾은 다음 "사과"토큰 바로 뒤에 오는 것과 일치하는 중괄호에 도달 할 때까지 계속 간다. 모든 항목을 삭제합니다.

+0

@Welbog, 저는 중괄호를 쓰는 것이 쉬운 프로그램이라고 생각하지 않습니다. 오류가 없다면 프로그램은 컴파일러와 마찬가지로 소스를 이해할 수 있어야합니다. – Codism

+0

@ 코드 : 중괄호를 세는 것은 간단합니다. 주석과 문자열 리터럴 내에서 중괄호와 같은 문제를주의해야합니다. 오류가 없도록 컨텍스트 프리 파서를 작성해야하지만, 이는이 작업의 복잡성 수준입니다. 중괄호 카운터는 아무 문제가없는 한 괜찮을 것입니다. – Welbog

0

이론적으로 정규 언어는 문맥 자유 문법으로 설명 된 문장을 표현할 수 없습니다. 일회 일이라면 수동으로 해보십시오.

0

VI로 전환. 그런 다음 여는 중괄호를 선택하고 d%을 눌러 섹션을 삭제할 수 있습니다.

+0

나는 VI를 좋아합니다. 하지만 나는 그걸 몰랐다.thanks –

+0

퍼센트 기호는 중괄호, 대괄호 및 괄호로 이동합니다. –

2


내가 꽤 똑똑하다고 생각 정의 최종 솔루션을 명확히하기 위해. 하지만 대부분의 IDE가 특정 서식 지정 표준을 시행 할 수 있기 때문에 괜찮습니다. 여기에 저를 데려 문제 - - 나는 관련 예제를 줄 수 있다면 나는 네, 기술적으로 정기적으로하지 않습니다 (자바) 형태의 표현

if (DEBUG) { 
    // possibly arbitrary statements or blocks 
} 

을 찾아보고 있었다, 그러나 나는 Eclispe를 실행 다음

if (DEBUG) { 
    statement(); 
    while (whatever) { 
    blahblahblah(etc); 
    } 
    // ... 
} 

하고 (물론,이 자바 정규식 구문)이 찾고

^(\s*)if \(DEBUG.*(?:\n\1 .*)*\n\1\} 
: 그들은 모두 반드시 (우리 회사의 일반적인 선호 코드 스타일)이처럼 보였다 확인 파일에 대한 코드 포매터를 만들려면

트릭을 했어.