[완료] 자바 코드 분석하다가 막혀서 질문드립니다...

gumagula의 이미지

읽어드릴 자바 파일에서 주석문을 빼주고 새로운 파일로 기록하는 프로그램코드를 자바로 제작해보려 했습니다.

제가 생각한 방식은, 소스코드를 파일로 불러와서, /*같은 녀석이 나오면 */이 나오는 녀석까지 무시하고,

//가 나오는 줄은 무시하고, 위에 2가지 경우에 해당되지 않을 때, 내용을 버퍼에 저장해서 새로운 파일에

한줄 한줄 기록하는 프로그램을 만들려고했습니다. 그런데 도저히 감히 안잡혀서 여러 포럼을 뒤져봤는데...

다음과 같은 매우 특이한 녀석을 찾아냈습니다...

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.BufferedReader;
 
class Cleaner{
    public static void main(String a[]) {
        String source = readFile("source.java");
        System.out.println(source.replaceAll("(?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/)|(?://.*)", ""));
    }
 
    static String readFile(String fileName) {
        File file = new File(fileName);
        char[] buffer = null;
        try {
            BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
            buffer = new char[(int) file.length()];
            int i = 0;
            int c = bufferedReader.read();
            while (c != -1) {
                buffer[i++] = (char) c;
                c = bufferedReader.read();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new String(buffer);
    }
}

이런식으로 간결하게 나와있는 녀석이 있더라구요. 짧아서 좋긴한데, 이해가 안가는 부분이 발생했습니다;;

System.out.println(source.replaceAll("(?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/)|(?://.*)", ""));

이부분이 의미하는 뜻과, 밑에서 입력된 파일을 수정하여 새로운 파일로 내보내 주는 부분이 이해가 가질 않습니다...

얼핏보기엔 주석형식을 토큰 처리해서 해당되는 구역의 내용을 빈공간으로 바꿔치기 한다는 내용 같기도 하고...

그리고 지정한 방식이 너무 특이하게 생겨서 어떤 문법으로 기술이 됬는지 알고싶습니다... 그리고 파일로 기록할때,

어떠한 방식으로 새 파일로 내용을 기록하게 되는지...

짐작만 가고 딱 이렇다 하고 내용 이해가 안되서요... 혹시 풀어서 설명해주실 분 계신가요 ㅠㅠ 도움 부탁드립니다...

익명 사용자의 이미지

참조하신 사이트가 http://ostermiller.org/findcomment.html 이 사이트를 참고 한거 같군요..

정규표현식으로 검색해보시면 됩니다.

다음 사이트 한번 간단하게 봐보시면 이해가 갈겁니다.
http://toomanyid.springnote.com/pages/1232788

ammoguy의 이미지

밑에 함수는
자바에선 String 데이터, 즉 바이너리가 아닌 캐릭터 형태의 입/출력은 **Reader **Writer 를 사용합니다.

File file = new File(fileName);

이부분은 시스템의 파일을 파일 객체를 생성해서 포인팅하게 하고

BufferedReader는 입출력에 버퍼를 사용해서 읽어들이는 패턴일 뿐입니다.
그냥 읽어들이면 디스크에서 파일을 읽는 속도와 시퓨가 프로세스가 다음 작업을 하는 사이 차이가 있기 때문에 에러가 나겠죠..

FileReader로 읽어들인 파일객체를 BufferedReader라는 중간소켓을 끼워 char배열(문자열)로 줄줄이
파일 끝부분에 다다를때까지 읽어들여 String 객체로 만드는거죠.

이 함수를 사용하는 메인메소드는 정규식으로 소스내용에서 주석을 제거해서 System.out으로 내보내는겁니다.

--------------cut here----------
너는 아느냐, 진정한 승리를

익명 사용자의 이미지

그냥 화면에 뿌려주기만 하는데요?
System.out.println으로요.

실제로 말씀하신 처리는 replaceAll 한줄에서 하는거고,
아래 메서드도 파일 읽어서 String으로 return하는거구요.

주석 제거는 정규표현식으로 다 합니다.

gumagula의 이미지

알려주신분들 전부 감사드립니다 (꾸벅...)

주신 링크랑 풀이 읽어보면서 다시 곱씹어 봐야겠습니다...

좋은 하루 되세요!

raymundo의 이미지

// 형태의 주석에 비해서 /*...*/ 주석은 (특히 여러 줄에 걸칠 수 있다는 것 때문에) 정규표현식으로 표시할 때 은근히 생각 외로 까다롭지요. 그리고 자기가 만들 땐 몰라도 남이 만든 정규식을 역으로 해석하는 것도 은근히 힘들고...

정규표현식에서 '.' '*' '[..]' '|' '(..)' 의 의미 정도까지 보신 후에 첫번째 리플에 달린 링크
http://ostermiller.org/findcomment.html
요걸 보시면 그때는 '아하!' 하실 수 있을 겁니다.
저도 지금 보면서 아하! 하고 있는 터라 ^^;

(어째 불필요하게 복잡하게 한다 싶더만 non-greedy 매칭을 할 수 없는 상황에서 얘기군요. 글 아래쪽에 가보면 훨씬 심플해지는 방법도 나오네요)

좋은 하루 되세요!

gumagula의 이미지

정말 감사드립니다 !

좀 더 열심히 해봐야 겠다는 생각이 들었습니다

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.