2013-03-22 3 views
1

텍스트 파일을 읽고 내용의 일부를 추가하고 제거하는 Java 프로그램이 있습니다. 텍스트 파일에서도 인라인 및 여러 줄 주석과 함께 작동합니다.자바를 사용하여 여러 주석 닫기 태그가있는 여러 줄 주석을 건너 뛰는 방법

는 예를 들어, 다음 부분은 제 자마자이 경우 예

/** 
*This 
* is 
*/ 
* a multiple line comment 
*/ 

들어

// inline comment 

/*multiple 
*comment 
*/ 

I 여러 주석 폐쇄가 발생하는 경우에 문제가 오전 생략 될 주석 종료 태그가 발생하면 주석 건너 뛰기가 중지되고 나머지 줄이 출력 파일에 인쇄됩니다. 나는이

boolean commentStart = false; 
boolean commentEnd = false; 

if(line.trim().indexOf("/*") != -1) { // start 
    commentStart = true; 
} 

if(line.trim().indexOf("*/") != -1 && commentStart) { // closed 
    commentEnd = true; 
    commentStart = false; 
} 

if(commentStart || (!commentStart && commentClosed)) { 
    //skip line 
} 

어떤 도움을하는 방법은 다음과

은? 고맙습니다.

+0

중첩 된 주석을 사용한다고 가정하겠습니다. 그러나 예제에서는이 사례를 보여주지 않습니다. –

+0

@MarkoTopolnik : 예. 중첩 된 주석도 마찬가지입니다. –

+1

먼저 표시 한 내용에 따라 다음 문자를 찾을 때까지 텍스트를 계속 검토 할 수 있으며, 위치를 저장하고 첫 번째/* 색인과 마지막 색인 \ */사이에/*가 없는지 확인하십시오. 두 개의 위치 사이에서 텍스트를 건너 뜁니다. – Anila

답변

0

중첩 된 주석으로 제한하지 않는 한 잘못된 형식의 파일이 있습니다. 그래도 괜찮 으면 이 인 내용을 /**/ 사이의 내용이 아니라고 정의해야합니다. 귀하의 예를 보면, 처럼 주석의 정의는 */, /*또는*으로 시작하는 줄입니다. regex : ^[/\\\b]?*.

정상적으로 일치하는 경우 줄을 건너 뜁니다.

+0

나에 따르면/*로 시작하고 * /로 끝나는 모든 행과이 두 행 사이의 모든 행은 주석이어야합니다. –

+0

알았어. 그런 다음 한 줄을 미리 읽어야합니다. @Anila의 대답을 확인하십시오. – Miquel

0

필자는 Java에서 인용 문자열과 모든 것을 고려하여 주석을 제거하는 Perl 정규 표현식을 사용합니다. grok하지 않는 유일한 것은 주석 또는 \ uXXXX 시퀀스로 만든 따옴표입니다.

sub strip_java_comments_and_quotes 
{ 
    s!( (?: \" [^\"\\]* (?: \\. [^\"\\]*)* \") 
    | (?: \' [^\'\\]* (?: \\. [^\'\\]*)* \') 
    | (?: \/\/ [^\n] *) 
    | (?: \/\* .*? \*\/) 
    ) 
    ! 
    my $x = $1; 
    my $first = substr($x, 0, 1); 
    if ($first eq '/') 
    { 
     # Replace comment with equal number of newlines to keep line count consistent 
     "\n" x ($x =~ tr/\n//); 
    } 
    else 
    { 
     # Replace quoted string with equal number of newlines to keep line count consistent 
     $first . ("\n" x ($x =~ tr/\n//)) . $first; 
    } 
    !esxg; 
} 

나는 자바로 변환에 이동을해야합니다 : 같은

Pattern re = Pattern.compile(
"( (?: \" [^\"\\\\]* (?: \\\\. [^\"\\\\]*)* \")" + 
"| (?: ' [^'\\\\]* (?: \\\\. [^'\\\\]*)* ')" + 
"| (?: // [^\\n] *)" + 
"| (?: /\\* .*? \\*/)" + 
")", Pattern.DOTALL | Pattern.COMMENTS); 
Matcher m = Pattern.matcher(entireSourceFile); 
Stringbuffer replacement = new Stringbuffer(); 
while (m.find()) 
{ 
     String match = m.group(1); 
     String first = match.substring(0, 1); 
     m.appendReplacement(replacement, ""); // Beware of $n in replacement string!! 
     if (first.equals("/")) 
     { 
     // Replace comment with equal number of newlines to keep line count consistent 
     replacement.append(match.replaceAll("[^\\n]", "")); 
     } 
     else 
     { 
     // Replace quoted string with equal number of newlines to keep line count consistent 
     // Although Java quoted strings aren't legally allowed newlines in them 
     replacement.append(first).append(match.replaceAll("[^\\n]", "")).append(first); 
     } 
} 
m.appendTail(replacement); 

뭔가!

관련 문제