使用正则表达式匹配多行C ++样式注释

问题描述 投票:0回答:4

好,我知道这是一个经常发生的问题,但是我似乎找不到仅基于正则表达式的单个工作解决方案。

所以,这就是我想出的(实际上是基于C# sharp grammar specification by ECMA中多行注释的“文字”描述。

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

但是,正如您所见,它不起作用...

Demo:

http://regexr.com?38gom

有什么想法吗?如果不进行各种修改,这是否有可能? (嗯,我的意思是除了正则表达式本身之外……大声笑)


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

c# c++ regex comments
4个回答
6
投票

这里是您从regexr.com提供的样本的有效正则表达式

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

或:

\/\*.*?\*\/

1
投票

如果您需要用于flex的代码,它不会实现非贪心匹配,这是编写正则表达式的一种方法:

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

替代,在眼睛上并不容易:

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

/不需要加引号。但是恒星确实如此,而且看起来更加一致。还有一种选择是用反斜杠为星星加引号,但我觉得更难阅读。


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


0
投票

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

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


0
投票

这里是简短的答案

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

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

© www.soinside.com 2019 - 2024. All rights reserved.