[英]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.