好的,我知道这是一个反复出现的问题,但我似乎无法找到一个完全基于正则表达式的单一工作解决方案。
所以,这就是我提出的问题(实际上是基于C# sharp grammar specification by ECMA中多行评论的'字面'描述)。
\/\*(([^\*])+)|([\*]+(?!\/))[\*]+\/
但是,你可以看到它不起作用......
演示:
有什么想法吗?如果不做各种各样的黑客攻击,这是否可行? (好吧,我的意思是除了正则表达式本身......哈哈)
PS 如果它具有任何信息价值,我目前正在使用Lex / Bison / C / D开发词法分析器/解析器/解释器,显然多行注释是需要考虑的事情...
答案 0 :(得分:5)
答案 1 :(得分:1)
如果您需要flex
,而不实现非贪婪的匹配,这里有一种编写正则表达式的方法:
[/][*][^*]*[*]+([^/*][^*]*[*]+)*[/]
替代方案,眼睛不容易:
"/*"[^*]*"*"+([^/*][^*]*"*"+)*"/"
/ 不需要引用。但是明星会这样做,而且似乎更加一致。另一个选择是引用带有反斜杠的星星,但我发现它更难以阅读。
如果你确实需要flex
/ lex
,那么最好放一个合适的标签,例如flex-lexer。
答案 2 :(得分:0)
在C#中,我使用@"(?s:/\*((?!\*/).)*\*/)"
获得最佳效果。
如果您想匹配所有评论(包括行评论),请使用@"(?>/(/[^\r\n]*|(?s:\*((?!\*/).)*\*/)))"
。
答案 3 :(得分:0)
这是简短的答案
\/\*(.*?|\s)*\*\/
它将从/*
开始,然后.*
逐一读取char,而\s
读取空白(包括换行),最后在*/
结束。这对我来说使用C#是有效的。