正则表达式注释

时间:2014-06-05 18:48:24

标签: regex

我有两种评论 ///*...*/ 我需要匹配/*...*/并选择这些评论之间的所有数据。 然后将// +添加到所有数据,包括/ *和* /,它将如下所示:

//+/*
//+ line 1
//+ line 2
//+*/

同一个文件的评论标记为//,不应选择这些评论。 使用以下正则表达式,它将选择以/

开头的每一行

^[ \t]*[\/\*] .*

^[ \t]*[\*\/].*

用于标识/**/条评论的开头和结尾的正确正则表达式是什么。 感谢。

更新: 可以使用表达式来获得/**/的完全匹配吗? 要搜索/*我使用了\/*.,但如果遇到//,它也会选择它。

1 个答案:

答案 0 :(得分:4)

我写过an entire article on figuring out the regular expression for comments。这不是一个微不足道的问题。最终结果是:

 (/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)

还值得指出这个重要的警告:

  

其他元素内的评论

     

虽然我们的正则表达式很好地描述了c风格的注释,但是当某些东西看起来像是注释但实际上是更大元素的一部分时仍然存在问题。

someString = "An example comment: /* example */";

// The comment around this code has been commented out.
// /*
some_code();
// */
  

解决方法是编写描述每个可能更大元素的正则表达式,同样找到它们,确定每个元素的类型,并丢弃不是注释的元素。有些工具称为词法分析器或标记器,可以帮助完成此任务。词法分析器接受正则表达式作为输入,扫描流,挑选与正则表达式匹配的标记,并根据匹配的表达式对标记进行分类。正则表达式的贪婪属性用于确保最长匹配。虽然为C编写完整的词法分析器超出了本文档的范围,但有兴趣的人应该查看词法生成器,例如FlexJFlex

正则表达式不是将块注释转换为行注释的正确方法。 This question询问如何使用任何方法执行此操作。有些工具比正则表达式做得好得多。接受的答案建议使用软件recomment