为什么 `/\:/u` 会抛出“无效转义”错误?

Aer*_*ang 5 javascript regex

我有这样的代码:

\n
url.match(/^https?\\:\\/\\/([^\\/:?#]+)(?:[\\/:?#]|$)/ui)\n
Run Code Online (Sandbox Code Playgroud)\n

ESLint 说Parsing error: Invalid regular expression: /^https?\\:\\/\\/([^\\/:?#]+)(?:[\\/:?#]|$)/: Invalid escape

\n

我不明白为什么这个正则表达式是错误的。我应该如何修复它?

\n

Seb*_*mon 8

u不必要的转义序列对于该标志无效

\n

\\:是不必要的转义序列。这些在使用标志时无效u。就用:代替吧。

\n

规范、调试器、文档

\n

这些是字符类之外的特殊字符的有效且必要的转义序列:\\$, \\(, \\), \\*, \\+, \\., \\?, \\[, \\\\, \\], \\^, \\{, \\|, \\}(所有\xe2\x80\x9csyntax 字符\xe2\x80\x9d)和\\/(特殊情况身份逃避)。

\n

其他转义序列如\\ , \\!, \\", \\#, \\%, \\&, \\\', \\,, \\-, \\:, \\;, \\<, \\=, \\>, \\@, \\_, \\`,\\~是不必要的,因此对该u标志无效。

\n

详细查看所有转义规则的规范。1

\n
\n

像RegEx101这样的工具报告这个 \xe2\x80\x8a\xe2\x80\x94\xe2\x80\x8aa 有点神秘,不过:

\n
\n

/\\:/u:

\n

\\:\xe2\x80\x8a\xe2\x80\x94\xe2\x80\x8a这个标记没有特殊含义,因此被渲染为错误

\n
\n
\n

至于文档,我刚刚在 MDN 上的正则表达式备忘单中添加了一条注释

\n
\n

请注意,某些字符(如:-@等)在转义或未转义时均没有特殊含义。\n转义序列(如 , , \\:\\-\\@等效于它们在正则表达式中的文字、未转义字符等效项。\n但是,在具有 unicode 的正则表达式中flag,这些将导致无效的身份转义错误。

\n
\n

基本原理

\n

注释继续:

\n
\n

这样做是为了确保与使用新转义序列(如\\p或 )的现有代码向后兼容\\k

\n
\n

当该功能被提出并引入时,提案\xe2\x80\x99s常见问题解答是这样说的:

\n
\n

向后兼容性怎么样?

\n

在没有标志的正则表达式中u,模式\\p是 的(不必要的)转义序列p。\n这种形式的模式\\p{Letter}可能已经存在于没有u标志的现有正则表达式中,因此我们无法在不破坏向后兼容性的情况下为此类模式分配新含义。

\n

因此,ECMAScript 2015 制作了不必要的转义序列,例如\\p和在设置标志时\\P 抛出异常。\n这使我们能够使用标志更改正则表达式中和u的含义,而不会破坏向后兼容性。\\p{\xe2\x80\xa6}\\P{\xe2\x80\xa6}u

\n
\n

此页面还链接自此ES 讨论线程,其中提出了此问题:

\n
\n

为什么 RegExp 是/\\-/u语法错误?

\n

JSLint 之前警告过-RegExp 中的未转义文字。\n但是,-与 unicode 标志一起转义u会导致 Chrome、Firefox 和 Edge 中出现语法错误(JSLint 已删除该警告)。\n只是好奇上述边缘情况的原因是一个语法错误。

\n

(我对语法进行了细微的调整。)

\n
\n

回复链接到上述 GitHub 存储库以及该提案,但也以不同的方式解释了其基本原理:

\n
\n

u标志视为正则表达式的严格模式。

\n
\n

因此,每当您使用该u标志时,请记住这一点。\n一旦您使用 ,RegExp 的行为就会开始略有不同。u\n某些新事物变得有效,但某些其他事物也会变​​得无效。\n例如,另请参阅为什么是/[\\w-+]/有效的正则表达式但/[\\w-+]/u无效?

\n
\n

1 : 您\xe2\x80\x99 将找到某些产生式规则,其中[U]的参数表示 Unicode 模式。\n请参阅语法符号参考来解码这些规则。

\n