“\/”在 javascript 正则表达式中有效吗?
Posted
技术标签:
【中文标题】“\\/”在 javascript 正则表达式中有效吗?【英文标题】:Is "\/" valid inside a javascript regex?“\/”在 javascript 正则表达式中有效吗? 【发布时间】:2011-10-10 14:26:15 【问题描述】:以下代码有效吗?
function test()
return /\//.exec("\/");
alert(test());
似乎许多 javascript 缩小器(包括 http://jscompress.com/ 的 jsmin)认为第二行的“//”是注释的开头。我认为这是“微不足道”实现的缩小器中的一个错误,因为我尝试的所有浏览器实现都可以毫无问题地运行它。 Try it on jsfiddle.
【问题讨论】:
这就是为什么一些正则表达式引擎允许你指定不同的分隔符... 我想知道规范如何声明这不会开始评论。var q = "//";
的有效方式可能相同。
@pimvdb 规范是,如果你有 /,那么直到下一个(非转义) / 的所有内容都是正则表达式文字。
这确实是有效的 Javascript。我是jscompress.com 的所有者,我刚刚部署了一个用node.js 和UglifyJS 构建的站点的新版本来解决这个问题。过去的版本是 php,JSMin 的 PHP 缩小库有 bug,没有单元测试。
【参考方案1】:
是的,这是有效的 javascript :) 这是缩小器中的一个错误,应该可以修复。如果你愿意,你可以通过让你的正则表达式在它的末尾加上一些愚蠢的东西来绕过它,比如:
return /\/(?:.|$)/.exec("\/");
这基本上说,要么是字符串的结尾,要么不是字符串的结尾,没有捕获。但我认为这不是一个好的解决方案,我自己也不会使用它哈哈。
【讨论】:
更好:return new RegExp("/").exec("\/");
@PaulPRO .|$
不匹配新行,因此它不等同于原始正则表达式。【参考方案2】:
是的,这是合法的。 \/
匹配文字 /
。第一个 \
转义了 /
。行:
/\//.exec("\/");
评估为:
["/"]
【讨论】:
如小提琴所示:)【参考方案3】:我有兴趣在规格中查找它,并且根据它是有效的:
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
的一部分,因此不能成为//
评论标记的一部分。
【讨论】:
以上是关于“\/”在 javascript 正则表达式中有效吗?的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript 中正则表达式验证 URL 网址合法性,实用有效