使用Regex匹配多行C ++样式注释

时间:2014-03-13 16:11:26

标签: c# c++ regex comments

好的,我知道这是一个反复出现的问题,但我似乎无法找到一个完全基于正则表达式的单一工作解决方案。

所以,这就是我提出的问题(实际上是基于C# sharp grammar specification by ECMA中多行评论的'字面'描述)。

\/\*(([^\*])+)|([\*]+(?!\/))[\*]+\/

但是,你可以看到它不起作用......

演示:

http://regexr.com?38gom

有什么想法吗?如果不做各种各样的黑客攻击,这是否可行? (好吧,我的意思是除了正则表达式本身......哈哈)


PS 如果它具有任何信息价值,我目前正在使用Lex / Bison / C / D开发词法分析器/解析器/解释器,显然多行注释是需要考虑的事情...

4 个答案:

答案 0 :(得分:5)

以下是regexr.com

中提供的示例的工作正则表达式
\/\*+((([^\*])+)|([\*]+(?!\/)))[*]+\/

或:

\/\*.*?\*\/

答案 1 :(得分:1)

如果您需要flex,而不实现非贪婪的匹配,这里有一种编写正则表达式的方法:

[/][*][^*]*[*]+([^/*][^*]*[*]+)*[/]

替代方案,眼睛不容易:

"/*"[^*]*"*"+([^/*][^*]*"*"+)*"/"

/ 不需要引用。但是明星会这样做,而且似乎更加一致。另一个选择是引用带有反斜杠的星星,但我发现它更难以阅读。


如果你确实需要flex / lex,那么最好放一个合适的标签,例如

答案 2 :(得分:0)

在C#中,我使用@"(?s:/\*((?!\*/).)*\*/)"获得最佳效果。

如果您想匹配所有评论(包括行评论),请使用@"(?>/(/[^\r\n]*|(?s:\*((?!\*/).)*\*/)))"

答案 3 :(得分:0)

这是简短的答案

\/\*(.*?|\s)*\*\/

它将从/*开始,然后.*逐一读取char,而\s读取空白(包括换行),最后在*/结束。这对我来说使用C#是有效的。