好,我知道这是一个经常发生的问题,但是我似乎找不到仅基于正则表达式的单个工作解决方案。
所以,这就是我想出的(实际上是基于C# sharp grammar specification by ECMA中多行注释的“文字”描述。
\/\*(([^\*])+)|([\*]+(?!\/))[\*]+\/
但是,正如您所见,它不起作用...
Demo:
有什么想法吗?如果不进行各种修改,这是否有可能? (嗯,我的意思是除了正则表达式本身之外……大声笑)
P.S。如果它具有任何参考价值,我目前正在使用Lex / Bison / C / D开发一个词法分析器/解析器/解释器,显然多行注释是要考虑的事情...
如果您需要用于flex
的代码,它不会实现非贪心匹配,这是编写正则表达式的一种方法:
[/][*][^*]*[*]+([^/*][^*]*[*]+)*[/]
替代,在眼睛上并不容易:
"/*"[^*]*"*"+([^/*][^*]*"*"+)*"/"
/不需要加引号。但是恒星确实如此,而且看起来更加一致。还有一种选择是用反斜杠为星星加引号,但我觉得更难阅读。
如果您确实需要flex
/ lex
,最好放一个合适的标签,例如flex-lexer。
在C#中,使用@"(?s:/\*((?!\*/).)*\*/)"
可获得最佳性能。
如果要匹配所有注释(包括行注释),请使用@"(?>/(/[^\r\n]*|(?s:\*((?!\*/).)*\*/)))"
。
这里是简短的答案
\/\*(.*?|\s)*\*\/
将从/*
开始,然后.*
逐一读取char,然后\s
读取空白(包括新行),最后在*/
结束。这对于使用C#的我来说是有效的。