查找所有注释的JavaScript正则表达式

时间:2016-05-09 17:07:36

标签: javascript regex

我试图在JavaScript中使用正则表达式删除JavaScript示例中的所有注释。

我的正则表达式如下:

/((\/\*+)(\*|\s)*([^]*[\*]*)(\*|\s)*(\*+\/))/g

运行它的样本是:

/*basic comment*/

console.log('turtle');

/*********************
Fancy liney comment
*********************/

console.log('turtle');

/****long basic comment ****/

console.log('turtle');

/*
 *
 * Oh look, it's one of these... great.
 *
 */

为方便起见,我已在regex101.com创建了此演示。

正如你在regex101上看到的,如果你正在使用珍珠正则表达式(PCRE),这一切都很完美,所有四条注释都被找到并注册为匹配。但是,我在JavaScript中执行此操作,如果您在regex101上选择JavaScript风格,您将看到整个块被突出显示为一个匹配,这意味着我可爱的乌龟日志在我去删除评论。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

只是为了解释发生了什么:]中的[^]被解释为匹配JS中任何不是的任何字符,而在PCRE中,它意味着< em>匹配非] (因为模式中稍后还有另一个未转义的])。因此,JS中的字符类是[^],而在PCRE中,正则表达式引擎找到的字符类是[^]*[\*]

您需要做的只是逃避角色类内的]

/((\/\*+)(\*|\s)*([^\]*[\*]*)(\*|\s)*(\*+\/))/g
                    ^^

问题是,JS regex风格中的字符类中的]应该被转义,即使它是类中的第一个字符。在PCRE和大多数其他falvors中,]在角色类中的第一个字符时不必进行转义。

请参阅the JS demo

但是,匹配多行注释的最有效模式是

/\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//g

请参阅regex demo

它几乎可以在任何正则表达式中使用。

答案 1 :(得分:1)

https://regex101.com/r/kI8iH7/2

看起来PCRE和Javascript regexp对[^]的处理方式不同。说实话,我不知道我期望做什么。通常在字符类中,前面的^表示否定该类,因此该类实际上匹配列出的所有字符。但是如果^不是类中的第一个字符,那么它只与自身匹配。如果^是班级中唯一的角色,那么PCRE和Javascript之间的看法似乎有什么不同。

在你的情况下,你似乎希望它意味着&#34;匹配任何东西&#34;,所以我只是用更常见的.*替换它。 (我也摆脱了跟随它的角色类,因为它不需要只有一件事,只能在一个类中。只需匹配实际的令牌,不需要匹配只包含一个令牌的类。)

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