【发布时间】: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 放在一个文件中,将正常代码放在另一个文件中。