【问题标题】:Regex code for removing single and multi-line comments from C code用于从 C 代码中删除单行和多行注释的正则表达式代码
【发布时间】:2014-08-23 06:46:14
【问题描述】:

我有以下正则表达式来删除多行注释,但我很难弄清楚如何删除以 // 开头的 cmets。

当我添加 (//.*) 作为正则表达式时,它似乎永远不起作用。

 pattern = r"""
                        ##  --------- COMMENT ---------
       /\*              ##  Start of /* ... */ comment
       [^*]*\*+         ##  Non-* followed by 1-or-more *'s
       (                ##
         [^/*][^*]*\*+  ##
       )*               ##  0-or-more things which don't start with /
                        ##    but do end with '*'
       /                ##  End of /* ... */ comment
                        ##
        |               ## --------- COMMENT ---------
         (//.*)         ## Start of // comment
                        ##
     |                  ##  -OR-  various things which aren't comments:
       (                ##
                        ##  ------ " ... " STRING ------
         "              ##  Start of " ... " string
         (              ##
           \\.          ##  Escaped char
         |              ##  -OR-
           [^"\\]       ##  Non "\ characters
         )*             ##
         "              ##  End of " ... " string
       |                ##  -OR-
                        ##
                        ##  ------ ' ... ' STRING ------
         '              ##  Start of ' ... ' string
         (              ##
           \\.          ##  Escaped char
         |              ##  -OR-
           [^'\\]       ##  Non '\ characters
         )*             ##
         '              ##  End of ' ... ' string
       |                ##  -OR-
                        ##
                        ##  ------ ANYTHING ELSE -------
         .              ##  Anything other char
         [^/"'\\]*      ##  Chars which doesn't start a comment, string
       )                ##    or escape

"""

有人可以告诉我我哪里出错了吗? 我什至尝试了以下正则表达式:

//[^\r\n]*$

但这也不起作用。

【问题讨论】:

  • 我记得,这有一个小技巧。
  • 在 C/C++ 中,字符串文字可以隐藏任何东西,包括 cmets。这就是为什么引用样式正则表达式段存在的原因。必须首先匹配它们才能将匹配位置移过它们并获得可能的评论。因此,不能排除这些正则表达式段。示例代码:char *p = "Hello /* World */ // EOS";
  • 我试过你的代码,但我不知道我在某个地方出错了:(它只是按原样返回给我,你是对的,上面的正则表达式修复了基本的东西,但不是字符串文字或其他任何东西。你能告诉我我哪里出错了吗?我使用了以 (?: #Comments... 开头的更大的代码
  • 我将在下面修复我的示例。您只是想删除 ALL cmets 吗?
  • 是的!!!!我一直在尝试所有可能的事情,但有些事情是如何出错的!我要做的就是进行 c 文件扫描,它将所有 cmets 放在一个文件中,将正常代码放在另一个文件中。

标签: python regex


【解决方案1】:

尝试其中一种...

它们都捕获 cmets 和非 cmets。


这个不保留格式并使用没有修饰符。
从 find while 循环中,将组 1 (cmets) 存储在新文件中,
替换为原始文件中的第 2 组(非 cmets)。
根据需要调整正则表达式换行符。 IE。将\n 更改为\r\n 等...

   # (/\*[^*]*\*+(?:[^/*][^*]*\*+)*/|//(?:[^\\]|\\\n?)*?\n)|("(?:\\[\S\s]|[^"\\])*"|'(?:\\[\S\s]|[^'\\])*'|[\S\s][^/"'\\]*)


   (                                # (1 start), Comments 
        /\*                              # Start /* .. */ comment
        [^*]* \*+
        (?: [^/*] [^*]* \*+ )*
        /                                # End /* .. */ comment
     |  
        //                               # Start // comment
        (?: [^\\] | \\ \n? )*?           # Possible line-continuation
        \n                               # End // comment
   )                                # (1 end)
|  
   (                                # (2 start), Non - comments 
        "
        (?: \\ [\S\s] | [^"\\] )*        # Double quoted text
        "
     |  '
        (?: \\ [\S\s] | [^'\\] )*        # Single quoted text
        ' 
     |  [\S\s]                           # Any other char
        [^/"'\\]*                        # Chars which doesn't start a comment, string, escape,
                                         # or line continuation (escape + newline)
   )                                # (2 end)

最后返工 -
在保留格式方面做得更好。
与换行符有关的格式问题已从注释尾部得到解决。
虽然这解决了字符串连接的问题,但它确实偶尔会留下空白
评论所在的行。对于 %98 的 cmets,这不是问题。
但是,是时候离开这只死狗了。

这个保留格式。它使用正则表达式修饰符 Multi-Line(一定要设置)。
执行与上述相同的操作。
这假设您的引擎支持\h 水平制表符。如果不告诉我。
根据需要调整正则表达式换行符。 IE。将\n 更改为\r\n 等...

   #  ((?:(?:^\h*)?(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/(?:\h*\n(?=\h*(?:\n|/\*|//)))?|//(?:[^\\]|\\\n?)*?(?:\n(?=\h*(?:\n|/\*|//))|(?=\n))))+)|("(?:\\[\S\s]|[^"\\])*"|'(?:\\[\S\s]|[^'\\])*'|[\S\s][^/"'\\\s]*)

   (                                # (1 start), Comments 
        (?:
             (?: ^ \h* )?                     # <- To preserve formatting
             (?:
                  /\*                              # Start /* .. */ comment
                  [^*]* \*+
                  (?: [^/*] [^*]* \*+ )*
                  /                                # End /* .. */ comment
                  (?:
                       \h* \n                                      
                       (?=                              # <- To preserve formatting 
                            \h*                              # <- To preserve formatting
                            (?: \n | /\* | // )              # <- To preserve formatting
                       )
                  )?                               # <- To preserve formatting
               |  
                  //                               # Start // comment
                  (?: [^\\] | \\ \n? )*?           # Possible line-continuation
                  (?:                              # End // comment
                       \n                               
                       (?=                              # <- To preserve formatting
                            \h*                              # <- To preserve formatting
                            (?: \n | /\* | // )              # <- To preserve formatting
                       )
                    |  (?= \n )
                  )
             )
        )+                               # Grab multiple comment blocks if need be
   )                                # (1 end)

|                                 ## OR

   (                                # (2 start), Non - comments 
        "
        (?: \\ [\S\s] | [^"\\] )*        # Double quoted text
        "
     |  '
        (?: \\ [\S\s] | [^'\\] )*        # Single quoted text
        ' 
     |  [\S\s]                           # Any other char
        [^/"'\\\s]*                      # Chars which doesn't start a comment, string, escape,
                                         # or line continuation (escape + newline)
   )                                # (2 end)

【讨论】:

  • 谢谢你!!!!!!!!!!!!哦,我的上帝,我不能为此感谢你!我尝试了第一个,它也保留了格式!我不知道如何表达我的感激之情,但你是我的英雄!!认真的谢谢!从一个星期开始就在这个问题上搞砸了我自己!非常感谢你!!!!!!
  • 哦,没问题,很高兴你有进展。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-04-01
  • 2011-01-28
  • 2011-05-23
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 2019-09-29
相关资源
最近更新 更多