我有两种类型的注释//
和/*...*/
我需要匹配/*...*/
并选择这些评论之间的所有数据。然后将//+添加到所有数据中,包括/*和*/,因此它看起来像:
//+/*
//+ line 1
//+ line 2
//+*/
同一个文件有标记为//
的注释,这些注释不应该被选中。使用下面的正则表达式,它将挑选以/
^[ t]*[/*] .*
^[ t]*[*/].*
标识/*
和*/
注释的开始和结束的正确正则表达式是什么?谢谢。
更新:可以有一个表达式来获得/*
或*/
的精确匹配吗?对于搜索/*
,我使用/*.
,但如果遇到//
,它也会选择它。
我已经写了一篇完整的文章来解释注释的正则表达式。这不是一个微不足道的问题。最终结果是:
(/*([^*]|[rn]|(*+([^*/]|[rn])))**+/)
还有一个重要的警告值得指出:
其他元素中的注释
尽管我们的正则表达式很好地描述了c风格的注释,但是当某些内容看起来是注释但实际上是更大元素的一部分时,仍然存在问题。
someString = "An example comment: /* example */";
// The comment around this code has been commented out.
// /*
some_code();
// */
这个问题的解决方案是编写正则表达式来描述每个可能的大元素,找到这些元素,确定每个元素的类型,并丢弃那些不是注释的元素。有一些称为词法分析器或标记器的工具可以帮助完成这项任务。词法分析器接受正则表达式作为输入,扫描流,挑选出与正则表达式匹配的标记,并根据匹配的表达式对标记进行分类。正则表达式的贪心属性用于确保最长匹配。尽管为C编写一个完整的词法分析器超出了本文档的范围,但感兴趣的人应该看看像Flex和JFlex这样的词法分析器生成器。
正则表达式不是将块注释转换为行注释的正确方式。这个问题问的是如何用任何方法做到这一点。有一些工具可以比正则表达式做得更好。接受的答案推荐软件推荐。