【问题标题】:Matching Multiline C++ style comments using Regex使用正则表达式匹配多行 C++ 样式注释
【发布时间】:2014-04-18 12:47:46
【问题描述】:

好的,我知道这是一个反复出现的问题,但是我似乎无法找到一个完全基于正则表达式的可行解决方案。

所以,这就是我想出的(实际上是基于C# sharp grammar specification by ECMA 中多行 cmets 的“字面”描述)。

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

但是,正如您所见,它不起作用...

演示:

http://regexr.com?38gom

有什么想法吗?如果不进行各种黑客攻击,这甚至可能吗? (嗯,我的意思是除了正则表达式本身......哈哈)


PS 如果它具有任何信息价值,我目前正在使用 Lex/Bison/C/D 开发词法分析器/解析器/解释器,显然多行 cmets 是需要考虑的。 .

【问题讨论】:

  • 什么语言? C++?如果是,请跳过我的评论,如果不是——请不要重复 C++ 的错误,它的多行 cmets 不能嵌套。
  • @greenoldmand 感谢您的建议。不,它不适用于 C++。这是给我自己的一个。 (顺便看看你的项目!;-))

标签: c# c++ regex comments


【解决方案1】:

这是您提供的来自 regexr.com 的示例的工作正则表达式

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

或:

\/\*.*?\*\/

【讨论】:

  • 好吧,好吧,好吧。 是的,它有效!我想我现在必须仔细研究一下,看看我做错了什么......
  • 虽然我不明白你的正则表达式。对我来说它看起来很复杂。我刚刚将您的 | 分组到括号内。
  • 好吧,不幸的是,似乎仍然存在一个现有的 cmets 无法说明的问题。看看这里:regexr.com?38gop
  • 使用这个\/\*.*?\*\/,但如果评论中有*/,它将不起作用。
【解决方案2】:

如果您需要 flex,它不实现非贪婪匹配,这是编写正则表达式的一种方法:

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

另类,对眼睛也不是很容易:

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

/ 不需要引用。但星星确实如此,而且看起来更加一致。另一种选择是用反斜杠引用星号,但我发现这更难阅读。


如果您确实需要为flex/lex 使用此标签,最好放置一个适当的标签,例如

【讨论】:

    【解决方案3】:

    在 C# 中,@"(?s:/\*((?!\*/).)*\*/)" 的性能最好。

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

    【讨论】:

      【解决方案4】:

      这是一个简短的答案

      \/\*(.*?|\s)*\*\/
      

      它将从/* 开始,然后.* 一个接一个地读取字符,\s 读取空格(包括换行符),最后在*/ 结束。这对我使用 C# 有用。

      【讨论】:

        猜你喜欢
        • 2013-04-20
        • 1970-01-01
        • 2012-10-12
        • 1970-01-01
        • 2012-10-26
        • 2015-02-25
        • 1970-01-01
        • 2021-09-03
        相关资源
        最近更新 更多