2014-03-13 63 views
0

好的,我知道这是一个反复出现的问题,但我似乎无法找到一个完全基于正则表达式的单一工作解决方案。因此,这就是我所想到的(实际上它基于C# sharp grammar specification by ECMA中多行注释的'字面'描述)。使用正则表达式匹配多行C++样式注释

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

然而,正如你可以看到它不工作...

演示:

http://regexr.com?38gom

任何想法?这甚至可能没有做各种黑客? (嗯,我的意思是比正则表达式本身以外...笑)


附:如果它是任何信息价值,我目前正在开发一个Lex/Bison/C/D的词法分析器/解析器和解释器,显然多行注释是一件需要考虑的事情...

+1

对于哪种语言? C++?如果是的话,请跳过我评论的其余部分,如果不是的话 - 请不要重复C++的错误,它的多行注释不能嵌套。 – greenoldman

+1

@greenoldmand感谢您的建议。不,不适用于C++。这是我自己的。 (也看看你的项目,顺便说一下!;-)) –

回答

4

这是工作正则表达式从regexr.com

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

或您提供的样本:

\/\*.*?\*\/ 
+0

好吧,好吧,好吧。 **是**,它的工作原理!我想我现在必须仔细研究它,看看我做错了什么...... –

+0

虽然我不明白你的正则表达式。它看起来很复杂。我刚刚分组了你的'|'里面的括号。 –

+0

不幸的是,似乎仍然存在一个问题,现有评论无法说明问题。看看这里:http://regexr.com?38gop –

1

如果你需要这个flex,它没有实现非贪婪匹配,这里是写的正则表达式的一种方式:

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

替代,对眼睛也不轻松:

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

/不需要被引用。但明星们的确如此,而且似乎更加一致。还有一种选择是用反斜杠引用星星,但我觉得更难读。


如果您确实需要这个flex/lex,你会更好过把一个适当的标记,如

0

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

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