是“\/”在 javascript 正则表达式中有效吗?

发布于 2024-11-25 10:07:07 字数 364 浏览 1 评论 0原文

以下代码有效吗?

function test() {
  return /\//.exec("\/");
}
alert(test());

似乎许多 javascript 压缩器(包括 http://jscompress.com/ 上的 jsmin)都考虑了“//”第二行是评论的开始。我认为这是“平凡”实现的缩小器中的一个错误,因为我尝试的所有浏览器实现都可以毫无问题地运行它。 在 jsfiddle 上尝试

Is the following code valid?

function test() {
  return /\//.exec("\/");
}
alert(test());

It seems that many javascript minifiers (including jsmin at http://jscompress.com/) consider the "//" on the second line to be the start of a comment. I assume it's a bug in the "trivially" implemented minifiers, since all the browser implementations I tried run it without a problem. Try it on jsfiddle.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

情未る 2024-12-02 10:07:07

我有兴趣在规范中查找它,根据它它是有效的:

RegularExpressionLiteral ::
    / RegularExpressionBody / RegularExpressionFlags
RegularExpressionBody ::
    RegularExpressionFirstChar RegularExpressionChars
RegularExpressionChars ::
    [empty]
    RegularExpressionChars RegularExpressionChar
RegularExpressionFirstChar ::
    RegularExpressionNonTerminator but not * or \ or / or [
    RegularExpressionBackslashSequence
    RegularExpressionClass
RegularExpressionChar ::
    RegularExpressionNonTerminator but not \ or / or [
    RegularExpressionBackslashSequence
    RegularExpressionClass
RegularExpressionBackslashSequence ::
    \ RegularExpressionNonTerminator
RegularExpressionNonTerminator ::
    SourceCharacter but not LineTerminator

\/ 被认为是 RegularExpressionBackslashSequence,因此是 RegularExpressionBody 的一部分,因此不能成为 // 注释标记的一部分。

I was interested in looking it up in the specs, and according to it it is valid:

RegularExpressionLiteral ::
    / RegularExpressionBody / RegularExpressionFlags
RegularExpressionBody ::
    RegularExpressionFirstChar RegularExpressionChars
RegularExpressionChars ::
    [empty]
    RegularExpressionChars RegularExpressionChar
RegularExpressionFirstChar ::
    RegularExpressionNonTerminator but not * or \ or / or [
    RegularExpressionBackslashSequence
    RegularExpressionClass
RegularExpressionChar ::
    RegularExpressionNonTerminator but not \ or / or [
    RegularExpressionBackslashSequence
    RegularExpressionClass
RegularExpressionBackslashSequence ::
    \ RegularExpressionNonTerminator
RegularExpressionNonTerminator ::
    SourceCharacter but not LineTerminator

The \/ is considered a RegularExpressionBackslashSequence, and hence is part of RegularExpressionBody, and as a result cannot be part of the // comment marker.

满地尘埃落定 2024-12-02 10:07:07

是的,这是有效的 javascript :) 这是压缩器中的一个错误,可能应该被修复。如果您愿意,您可以通过让正则表达式在其末尾添加一些愚蠢的内容来绕过它,例如:

return /\/(?:.|$)/.exec("\/");

基本上就是说,要么是字符串的结尾,要么不是字符串的结尾,而不捕获。但我认为这不是一个好的解决方案,我自己也不会使用它哈哈。

Yes, that is valid javascript :) That is a bug in the minifier, and should probably be fixed. You could get around it if you wanted by making your regex have something stupid at the end of it like:

return /\/(?:.|$)/.exec("\/");

Which basically says, either the end of the string, or not the end of the string, without capturing. But I don't think that's a good solution and I wouldn't use it myself haha.

雪落纷纷 2024-12-02 10:07:07

是的,这是合法的。 \/ 匹配文字 /。第一个 \/ 进行转义。该行:

/\//.exec("\/");

评估为:

["/"]

Yes, this is legal. \/ matches a literal /. The first \ escapes the /. The line:

/\//.exec("\/");

Evaluates to:

["/"]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文