Программа Lex для удаления комментариев из входного файла - PullRequest
0 голосов
/ 13 сентября 2018

В настоящее время я пытаюсь удалить все формы комментариев из входного файла.Однако я не могу понять, как удалить конкретную форму, особенно эту форму "{комментарий}".Я знаю, что на этом сайте есть множество примеров Regex для удаления многострочных / однострочных комментариев, но я не могу понять это.

Ввод:

       int j=100;
       /* comment needs to be removed*/
       int c = 200;


      /*
       *comment needs to be removed 
       */

      count = count + 1;

     {comment needs to be removed}

      i++;

Вывод:

int j=100;
int c =200;
count = count +1;
i++;

Мне уже удалось удалить первые 2 комментария, но не последний.Я попытался использовать регулярное выражение "{}".*, однако это не сработало для моего последнего комментария {comment}.Есть ли регулярное выражение, которое можно использовать для исправления этого, или я лучше создаю функцию в C и обрабатываю ситуацию таким образом?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

== Обратите внимание, что для всех приведенных ниже регулярных выражений совпадения должны быть заменены на $2 (группа захвата 2), которая записывает обратные комментарии. Это эффективно удаляет все комментарии ==

Вот стандартный синтаксический анализатор комментариев C ++.
Это расширенная версия, которая сохраняет форматирование.

raw:

(?m)((?:(?:^[ \t]*)?(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/(?:[ \t]*\r?\n(?=[ \t]*(?:\r?\n|/\*|//)))?|//(?:[^\\]|\\(?:\r?\n)?)*?(?:\r?\n(?=[ \t]*(?:\r?\n|/\*|//))|(?=\r?\n))))+)|("(?:\\[\S\s]|[^"\\])*"|'(?:\\[\S\s]|[^'\\])*'|(?:\r?\n|[\S\s])[^/"'\\\s]*)

с разделителями / regex /

/(?m)((?:(?:^[ \t]*)?(?:\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\/(?:[ \t]*\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/)))?|\/\/(?:[^\\]|\\(?:\r?\n)?)*?(?:\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/))|(?=\r?\n))))+)|((?:"[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'|(?:\r?\n(?:(?=(?:^[ \t]*)?(?:\/\*|\/\/))|[^\/"'\\\r\n]*))+|[^\/"'\\\r\n]+)+|[\S\s][^\/"'\\\r\n]*)/

Демонстрационный PCRE: https://regex101.com/r/UldYK5/1
Демо Python: https://regex101.com/r/avfSfB/1

-------------------------------------------- --------------

Это модифицированная версия выше, добавляя ваши { .. } комментарии.
( Это не рекомендуется, поскольку {} является синтаксисом в C )

raw:

(?m)((?:(?:^[ \t]*)?(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/(?:[ \t]*\r?\n(?=[ \t]*(?:\r?\n|/\*|//|\{)))?|//(?:[^\\]|\\(?:\r?\n)?)*?(?:\r?\n(?=[ \t]*(?:\r?\n|/\*|//|\{))|(?=\r?\n))|\{[\S\s]*?\}(?:[ \t]*\r?\n(?=[ \t]*(?:\r?\n|/\*|//|\{)))?))+)|((?:"[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'|(?:\r?\n(?:(?=(?:^[ \t]*)?(?:/\*|//|\{))|[^/"'\\\r\n{]*))+|[^/"'\\\r\n{]+)+|[\S\s][^/"'\\\r\n{]*)

с разделителями / regex /

/(?m)((?:(?:^[ \t]*)?(?:\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\/(?:[ \t]*\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/|\{)))?|\/\/(?:[^\\]|\\(?:\r?\n)?)*?(?:\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/|\{))|(?=\r?\n))|\{[\S\s]*?\}(?:[ \t]*\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/|\{)))?))+)|((?:"[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'|(?:\r?\n(?:(?=(?:^[ \t]*)?(?:\/\*|\/\/|\{))|[^\/"'\\\r\n{]*))+|[^\/"'\\\r\n{]+)+|[\S\s][^\/"'\\\r\n{]*)/

Демонстрационный PCRE (используя ваш образец текста): https://regex101.com/r/xHTua7/1

Версия для чтения с комментариями

    (?m)                             # Multi-line modifier
    (                                # (1 start), Comments 
         (?:
              (?: ^ [ \t]* )?                  # <- To preserve formatting
              (?:
                   /\*                              # Start /* .. */ comment
                   [^*]* \*+
                   (?: [^/*] [^*]* \*+ )*
                   /                                # End /* .. */ comment
                   (?:                              # <- To preserve formatting 
                        [ \t]* \r? \n                                      
                        (?=
                             [ \t]*                  
                             (?:
                                  \r? \n 
                               |  /\*
                               |  // 
                               |  \{                               # Added:  for {} comments
                             )
                        )
                   )?
                |                                 # or,
                   //                               # Start // comment
                   (?:                              # Possible line-continuation
                        [^\\] 
                     |  \\ 
                        (?: \r? \n )?
                   )*?
                   (?:                              # End // comment
                        \r? \n                               
                        (?=                              # <- To preserve formatting
                             [ \t]*                          
                             (?:
                                  \r? \n 
                               |  /\*
                               |  // 
                               |  \{                               # Added:  for {}  comments
                             )
                        )
                     |  (?= \r? \n )
                   )
                |                                 # or,
                   \{                               # Added:  Start { .. } comment
                   [\S\s]*? 
                   \}                               # Added:  End { .. } comment
                   (?:                              # <- To preserve formatting 
                        [ \t]* \r? \n                                      
                        (?=
                             [ \t]*                  
                             (?:
                                  \r? \n 
                               |  /\*
                               |  // 
                               |  \{                               # Added:  for {} comments
                             )
                        )
                   )?
              )
         )+                               # Grab multiple comment blocks if need be
    )                                # (1 end)

 |                                 ## OR

    (                                # (2 start), Non - comments 
         # Quotes
         # ======================
         (?:                              # Quote and Non-Comment blocks
              "
              [^"\\]*                          # Double quoted text
              (?: \\ [\S\s] [^"\\]* )*
              "
           |                                 # --------------
              '
              [^'\\]*                          # Single quoted text
              (?: \\ [\S\s] [^'\\]* )*
              ' 
           |                                 # --------------

              (?:                              # Qualified Linebreak's
                   \r? \n                           
                   (?:
                        (?=                              # If comment ahead just stop
                             (?: ^ [ \t]* )?
                             (?:
                                  /\*
                               |  // 
                               |  \{                               # Added:  for {} comments
                             )
                        )
                     |                                 # or,
                                                         # Added:  [^{] for {} comments
                        [^/"'\\\r\n{]*                   # Chars which doesn't start a comment, string, escape,
                                                         # or line continuation (escape + newline)
                   )
              )+
           |                                 # --------------
                                               # Added:  [^{] for {} comments
              [^/"'\\\r\n{]+                   # Chars which doesn't start a comment, string, escape,
                                               # or line continuation (escape + newline)

         )+                               # Grab multiple instances

      |                                 # or,
         # ======================
         # Pass through

         [\S\s]                           # Any other char
                                          # Added:  [^{] for {} comments
         [^/"'\\\r\n{]*                   # Chars which doesn't start a comment, string, escape,
                                          # or line continuation (escape + newline)

    )                                # (2 end), Non - comments 
0 голосов
/ 13 сентября 2018

Я не знаю, какой комментарий содержится в { и }, но вы должны быть осторожны.

Попробуйте это регулярное выражение.

\/\*[\s\S]*?\*\/|{[^{}]*?}

Попробуйте онлайн

...