하고 싶은 얘기를 마음대로 쓰는 게시판입니다. 개발 관련 이야기, 살면서 재미있었던 일, 인생 상담, 예쁘고 신기한 사진 등 마음대로 떠들어 보세요. 단, 개발관련 질문만은 별도의 게시판을 이용해 주십시오.
  • [샘플] 코드 주석제거하기 입니다. C#
  • 조회 수: 1750, 추천 수: 0/0, 2015-11-25 14:09:34(2015-11-25)
  • 이것도 예전에 쿼리 파일에서 주석만 제거할일이 있어서 만들었던 로직입니다.

    콜백 부분이 좀 안이쁘니까요. 이쁘게 고쳐서 사용하시면 좋겠네요.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    private void RemoveComments(string pathIN, string pathOUT)
    {
        bool bResult = false;
        string buffer = string.Empty;
        System.IO.StreamReader sr = null;
        System.IO.StreamWriter sw = null;
     
        try
        {
            sr = new System.IO.StreamReader(pathIN);
            sw = new System.IO.StreamWriter(pathOUT);
     
            // EOF까지 루프
            while ((buffer = sr.ReadLine()) != null)
            {
                bResult = removeComment(ref buffer, ref sr, ref sw);
                if(bResult == true)
                    sw.WriteLine(buffer);
                else
                    break;
            }
        }
        catch(Exception ex)
        {
            // 무언가 예외오류 발생
        }
     
        if(sr != null)
            sr.Close();
     
        if(sw != null)
            sw.Close();
    }
     
    private bool removeComment(ref string buffer, ref System.IO.StreamReader sr, ref System.IO.StreamWriter sw)
    {
        const string COMMENT = "--";        // 한줄짜리 주석문자
        const string BLOCK_START = "/*";    // 범위시작 주석문자
        const string BLOCK_END = "*/";      // 범위종료 주석문자
     
        int comment, blockStart, blockEnd;
        int startIdx = buffer.Length;
     
        while (true)    // '--'를 검색
        {
            if ((comment = buffer.LastIndexOf(COMMENT, startIdx)) == -1)
                break;
            else
            {
                // '--'발견. '--'앞에 '/*'가 있는지 검색.
                if (comment > 0 && (blockStart = buffer.LastIndexOf(BLOCK_START, comment - 1)) != -1// '--'앞에 최소 2자 이상 있나?
                {
                    // '/*'발견. '/*'와 '--'사이에 '*/'가 있는지 검색.
                    blockEnd = buffer.IndexOf(BLOCK_END, blockStart + 2);
                    if (blockStart < blockEnd && blockEnd < comment)
                    {
                        // ['/*' + '*/' + '--']패턴인 주석. '--'이후를 삭제해서 범위주석을 삭제한후 범위주석을 처리.
                        buffer = buffer.Remove(comment);
                        startIdx = buffer.Length;
                    }
                    else
                    {
                        if (blockStart == 0)
                            break;
     
                        startIdx = blockStart - 1;
                    }
                }
                else
                {
                    // '--'뿐인 주석. '--'이후를 모두 삭제
                    buffer = buffer.Remove(comment);
                    startIdx = buffer.Length;
                }
            }
        }
     
        if (buffer == string.Empty) // 이미 공백일 경우 범위주석처리는 필요없음.
            return true;
     
     
        // 범위주석을 처리 ###########################################################
        while (true)
        {
            blockStart = buffer.IndexOf(BLOCK_START);
            blockEnd = buffer.IndexOf(BLOCK_END);
     
            // 범위주석문자 없음. 처리종료
            if (blockStart == -1 && blockEnd == -1)
                break;
            else if (blockStart != -1 && blockEnd != -1)
            {
                // '/*' + '*/' 패턴인 주석. '/*'에서 '*/'까지 삭제
                buffer = buffer.Remove(blockStart, (blockEnd + 2- blockStart);    // +2는 BLOCK_END까지 삭제하기 위한것.
                continue;
            }
            else if (blockStart != -1 && blockEnd == -1)
            {
                // '/*'
                // …
                // '*/' 패턴의 주석. '*/'를 만날때까지 파일을 추가로 읽어들임.
                buffer = buffer.Remove(blockStart);
                sw.WriteLine(buffer);
     
                while ((buffer = sr.ReadLine()) != null)
                {
                    if ((blockEnd = buffer.IndexOf(BLOCK_END)) != -1)
                    {
                        buffer = buffer.Remove(0, blockEnd + 2);  // +2는 BLOCK_END까지 삭제하기 위한것.
                        //buffer = buffer + nextLine;
     
                        // '*/'이후로 다른 주석이 올 가능성이 있으므로 재귀콜
                        removeComment(ref buffer, ref sr, ref sw);
                        return true;
                    }
                    else
                    {
                        sw.WriteLine();
                    }
                }
                // EOF까지 '*/'가 발견되지 않음. 오류!
                return false;
            }
            else
            {
                // '/*'없이 '*/'가 발견됨. 오류!
                return false;
            }
        }
        return true;
    }
     
    cs

     

     

댓글 0

현재 게시판 기능 테스트중입니다. 디자인이나 게시판 구성은 언제든지 예고없이 변경될 수 있습니다.