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

查找所有注释的JavaScript正则表达式,javascript,regex,Javascript,Regex,我试图使用JavaScript中的正则表达式去除JavaScript示例中的所有注释 我的正则表达式如下: /((\/\*+)(\*|\s)*([^]*[\*]*)(\*|\s)*(\*+\/))/g 我运行它的示例是: /*basic comment*/ console.log('turtle'); /********************* Fancy liney comment *********************/ console.log('turtle'); /***

我试图使用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上看到的,如果您使用的是pearlyregex(PCRE),那么这一切都可以完美地工作,所有四条注释都可以找到并注册为匹配项。然而,我是用JavaScript来做这件事的,如果你在regex101上选择JavaScript风格,你会看到整个块突出显示为一个匹配,这意味着当我去删除注释时,我可爱的海龟日志被删除了。任何帮助都将不胜感激。

看起来PCRE和Javascript正则表达式对
[^]
的处理方式不同。老实说,我不知道我会期望它做什么。通常在字符类中,前面的
^
表示否定该类,因此该类实际上匹配所有未列出的字符。但是如果
^
不是类中的第一个字符,则它只匹配自身。如果类中只有
^
字符,PCRE和Javascript之间似乎存在不同的意见

在您的例子中,您似乎希望它的意思是“匹配任何东西”,所以我只是用更常见的
*
替换了它。(我还去掉了后面的character类,因为永远不需要只有一个东西,只需要自己在类中。只需匹配实际标记,不需要匹配只包含一个标记的类。)


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

您只需在character类中转义
]

/((\/\*+)(\*|\s)*([^\]*[\*]*)(\*|\s)*(\*+\/))/g
                    ^^
问题是,JS regex flavor中character类中的
]
应该转义,即使它是类中的第一个字符。在PCRE和大多数其他Falvor中,
]
是字符类中的第一个字符时,不必转义

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

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


它在几乎所有的正则表达式中都能起到同样的作用。

这部分的功能和你想象的一样吗<代码>[^]*[\*]
var trollString=“aaa和…/*您失败了!*/:p”使你的
*
不贪婪,但正如@NiettheDarkAbsol指出的,这是一个脆弱的解决方案。无论如何,除非我遗漏了什么,
\/\*[\s\s]*?\*\/
似乎更简单。无论如何,多行注释的最佳正则表达式是。它将它们作为一个整体进行匹配。看起来PCRE和Javascript regexp对
[^]
的处理方式不同-它们对该模式的解析方式也不同,因为它们是不同的regex风格
[^]
表示在JS中不是空的任何字符。是的,而且在PCRE中,
[^]
似乎都不合法。相反,整个代码片段被视为一个单一字符类,与
]
*
[
\*
中的任何一个匹配(尽管在这种情况下它显然忽略了```)
是不合法的,并且被认为是用户错误-因此产生了错误。在JS中,不知道为什么,他们决定接受
[]
作为匹配的nothing构造,并且
[^]
作为一个匹配任何事物的结构,它不是零。这是一个很好的答案+1,但是Paul L的答案也很好。完美的Wiktor,非常完美。我已经将它插入了我的代码中,我的单元测试突然全部变绿,非常感谢!:)并感谢所有提供反馈和答案的人!