正则表达式匹配所有注释 //, /* */

Posted

技术标签:

【中文标题】正则表达式匹配所有注释 //, /* */【英文标题】:regex to match all comments //, /* */ 【发布时间】:2017-05-22 00:14:33 【问题描述】:

我正在尝试编写正则表达式来查找给定文件中的所有 cmets。我应该处理的 cmets 是多线通信,例如

/* comments.
is multiline comment*/

// one liner comment.

我搜索了几个地方,并找到了一些答案。 (one answer) 我设法写了一些可以满足我大部分需求的东西:

(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/|//.*\n?)

我的代码唯一有问题的是它在字符串中捕获了 cmets。例如

String str = " hey, // I'm not a comment "

我的代码得到“我不是评论”但它不应该。 我尝试了几种方法,例如negativelookahead 和lookbehind,但似乎没有任何效果。

有什么方法可以做我想做的事吗?/ 谢谢。

编辑: 我使用的语言是python

【问题讨论】:

在这种情况下,将 python 标签添加到您的问题中。 不要使用正则表达式来解析编程语言。正如您所注意到的,正则表达式无法做到这一点。这是一个硬性限制,没有变通方法,无论如何尝试这样做的每个解决方案都是不正确的。 【参考方案1】:

通常,请考虑使用解析器(以考虑嵌套 cmets 等)。话虽如此,如果支持 (*SKIP)(*FAIL) 构造,您可以使用它(您没有指定您的编程语言):

"[^"]+"(*SKIP)(*FAIL)
|
'[^']+'(*SKIP)(*FAIL)
|
(?|
    //(?P<comment>.+)
|
    /\*(?P<comment>[\s\S]+?)\*/
)

a demo on regex101.com

【讨论】:

我在用 python 写。我不知道这种语法,如果我试图在我的程序中使用您的代码(可能是因为您为另一种语言编写),它就不起作用。 python也有这样的东西吗? 有,使用较新的 regex 模块 (pip install regex) 并为上面的正则表达式使用详细模式。

以上是关于正则表达式匹配所有注释 //, /* */的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配注释(单行或多行)并匹配其他所有内容(C#)

使用正则表达式匹配 Lua 多行字符串和注释

正则表达式匹配 MySQL 注释

正则表达式匹配 PHP 注释

正则表达式匹配代码块的注释

正则表达式到源代码注释