查找C语言风格的块注释的正则表达式

26
如何使用正则表达式查找这个模式?
C风格的块注释
/* xxxxxxxxxxxx */

如果/*//在同一行且在//之后,这意味着它不会开始一个注释,那该怎么办? - Patashu
1
不,我不需要处理这种情况。 - linquize
除了使用正则表达式之外,如果你想要全力以赴,你可以使用一个带有C(或其他)语言语法的语言解析器。例如yacc、javacc、antlr。 - Jasper Blues
1
参考这个评论,了解一些关于识别C语言注释的复杂性的想法,以便“正确”地处理它们(即“以C编译器必须处理C注释的方式”)。这并不是一件简单的事情。你可能只需要处理简单的注释——但请为编译器编写者着想。我猜还有其他相关的问题和答案。(不,这个问题不是被引用的那个问题的重复。) - Jonathan Leffler
我尝试使用Java编写“\/\(\(?!\/)|[^*])\\”但是在String类的匹配函数中,它抛出了java.util.regex.PatternSyntaxException异常:索引23附近有意外的内部错误。有人知道为什么吗? - Yahia Farghaly
这对我有用: /*.*?*/ - orellabac
1个回答

42

尝试使用

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

用于捕获单行和多行块注释。它搜索/*后面跟着任意数量的以下字符之一:

  • *,其后不跟随/
  • *外的任何字符

然后再搜索结束标记*/


你不需要在单独的分支中匹配空格字符;[^*/]已经覆盖了它们。所有|\s所做的就是让你面临灾难性回溯。此外,你需要将斜杠移出去,否则你的正则表达式将无法匹配带有斜杠的注释。 - Alan Moore
根据您的建议进行了更改(尽管原帖中提到,带斜杠的注释似乎不是问题)。 - Campfire
10
使用 /\*.*?\*/ 不是更简单吗? - ensonic
1
我喜欢添加原始字符串 r"/[*]([^*]|([*][^/]))*[*]/",因为它在Python中运行良好! - KRoy
1
@shuva,我很喜欢你的正则表达式,但现在它错过了/* ... **/,因为倒数第二个星号会匹配[*][^/],但这也会吞掉最后一个星号。作为一个快速修复,我使用了r"/[*]([^*]|([*][^/]))*[*]+/"(注意末尾的额外加号,允许额外的尾随星号)。 - Charles Ofria
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接