我试图在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风格,您将看到整个块被突出显示为一个匹配,这意味着我可爱的乌龟日志在我去删除评论。任何帮助将不胜感激。
答案 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)*(\*+\/))