2016-06-21 2 views
1

나는 정규 표현식이 의견을 (너희가 나쁜,하지만 나를 위해 작동)정규식 자바에게 일치하는 것을 제외한 모든 텍스트를 삭제

String regex = (^\/\/.*)|(\s+\/\/.*)|((\/\*)(.|\n)+?(\*\/)); 

이 코드는 모든 commtents을 삭제해야합니다 삭제해야하는

Pattern.compile(regex).matcher(some text).replaceAll(" "); 

하지만 어떻게 내가 제외한 모든 정규식을 삭제할 수 있습니까?

예를 들어

: 나는이 같은 문자열이있는 경우 :

/*Comments it's cool*/ public static void foo(){}

내 정규 표현식 일치 의견,하지만 난이 일치하지 않는 것을 삭제해야합니다, 그래서 보일 것 같은 :

/*Comments it's cool*/ 
+0

일치하는 항목을 모두 연결 하시겠습니까? – VLef

+0

오, 어서 - 정규식과 일치시키고 결과 문자열/버퍼/etc에 추가하십시오. BTW,'(. | \ n) +? '를 사용하여 정말 행복해하셨습니까? 최소한'. *?'를 사용하십시오 ('(? s)'인라인 한정자로). 그러나 여러 줄 주석에 대해 훨씬 더 나은 정규 표현식이 있습니다. –

+0

그리고'(^ \/\ /.*) | (\ s + \/\ /.*)'는'(\ s * \/\ /.*)'와 같습니다. – ClasG

답변

0

기본적으로 정규식과 일치하는 항목을 매치하고 일치하는 텍스트를 연결할 수 있습니다. 훨씬 쉽습니다. 원래 패턴이 일치하는 것을 제외한을 모두 제거하는 정규식에 대해서는

, 당신은 캡처 옵션 그룹과 전체 패턴을 캡처 고려해야 사용하고 이후 모든 문자와 일치하는 .를 사용할 수 있습니다.

당신의 패턴은 abc입니다. abc과 일치합니다. 하지만 지금, 당신은 당신의 정규식이 일치하지 않는 모든 것을 정반대로 일치시킬 필요가 있습니다.

(?s)(abc)?. 

$1으로 바꾸십시오. regex demo을 참조하십시오.

개조에는 약간의 조정이 필요할 수 있습니다. 개행을 제거하지 않으려면 DOTALL 수정자를 사용하지 마십시오. 사용하려는 경우 원래 패턴으로 으로 .을 대체하십시오. 일부 (\r?\n|\r){2,} 패턴 (다시 말하면 $1 역 참조)으로 빈 줄을 축소 할 수 있습니다.

그래서, 당신의 정규식

String regex = "^\\s*//.*|/\*[^*]*\*+(?:[^/*][^*]*\*+)*/"; 

입니다 /\*[^*]*\*+(?:[^/*][^*]*\*+)*/ 일치 여러 의견 및 ^\\s*//.* 일치 만일 Singleline 의견.

는, 그것이 일치하는 것을 제외하고 모두를 제거 할

String regex = "(?sm)(^\\s*//[^\r\n]*|/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/)?."; 

를 사용하고 $1 역 참조로 대체합니다. regex demo (ClasG demo 기준)을 참조하십시오. 참고 ^을 줄 시작 부분에 일치 시키려면 (?m) MULTILINE 한정자를 추가했습니다.

관련 문제