繁体   English   中英

查找所有评论的JavaScript正则表达式

[英]JavaScript regex that finds all comments

我正在尝试使用JavaScript中的regex去除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风格,则会看到整个块被突出显示为一个匹配项,这意味着当我删除注释时,我可爱的乌龟日志会被杀死。 任何帮助将不胜感激。

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

您需要做的只是在字符类中转义[ ]

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

事实是, 即使 JS正则表达式风格的字符类中的a ]是该类中的第一个字符,也应对其进行转义。 在PCRE和大多数其他偏爱中, ]是字符类中的第一个字符时,不必转义。

参见JS演示

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

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

正则表达式演示

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

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

看起来PCRE和Javascript正则表达式对待[^]有所不同。 老实说,我不知道该怎么做。 通常在字符类中,前面的^表示否定该类,因此该类实际上与所有列出的字符匹配。 但是,如果^不是类中的第一个字符,则它仅与自身匹配。 如果^是类中的唯一字符,PCRE和Javascript似乎有不同的看法。

在您的情况下,您似乎希望它表示“匹配所有内容”,因此我只用更常见的.*代替了它。 (我也摆脱了紧随其后的字符类,因为不再需要仅一件事就可以单独放在一个类中。只需匹配实际的令牌,而不必匹配仅包含一个令牌的类。)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM