【问题标题】:Regular expression to find C style block comments [duplicate]查找C样式块注释的正则表达式[重复]
【发布时间】:2013-04-16 03:02:57
【问题描述】:

如何使用正则表达式找到这种模式?

C 样式块 cmets

/* xxxxxxxxxxxx */

【问题讨论】:

  • 如果/* 在同一行并且在// 之后,意味着它不会开始评论怎么办?
  • 不,我不需要处理这种情况
  • 除了使用正则表达式之外,如果您想全力以赴,您可以使用带有 C(或其他)语言语法的语言解析器。示例有 yacc、javacc、antlr
  • 看到这个comment关于识别 C cmets 的问题有关“正确”处理 C cmets 的复杂性(意思是“以 C 编译器必须处理 C cmets 的方式” )。这不是直截了当的。您可能只处理简单的 cmets — 但请考虑编译器编写者。我怀疑还有其他相关的问题和答案。 (不;此问题与所引用的问题不重复。)
  • 我尝试使用 java 编写为 "\\/\*(\*(?!\\/)|[^*])*\*\\" 但具有字符串类的匹配功能,它抛出 java.util.regex.PatternSyntaxException 异常:索引 23 附近出现意外内部错误。有人知道为什么吗?

标签: regex


【解决方案1】:

尝试使用

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

捕获单行和多行块 cmets。它搜索/*,后跟任意数量的:

  • * 后面没有 /
  • 任何字符除了 *

然后再次关闭*/

【讨论】:

  • 您不需要在单独的分支中匹配空白字符; [^*/] 覆盖了它们。 |\s 所做的所有事情就是让你看到catastrophic backtracking。此外,您需要从那里取出斜线,否则您的正则表达式将无法匹配带有斜线的 cmets。
  • 更改为您的建议(尽管 OP 说,带有斜线的 cmets 似乎不是问题)
  • 使用/\*.*?\*/会不会更简单。
  • 我喜欢添加原始字符串r"/[*]([^*]|([*][^/]))*[*]/",因为它在 python 中工作!
  • @shuva,我很喜欢你的正则表达式,但现在它错过了/* ... **/,因为倒数第二颗星将匹配[*][^/],但这也吃掉了最后一颗星。作为快速修复,我使用了r"/[*]([^*]|([*][^/]))*[*]+/"(注意末尾的额外加号,允许额外的尾随星号。)
猜你喜欢
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 2011-11-25
  • 2014-01-27
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
相关资源
最近更新 更多