我有这样的代码:
\nurl.match(/^https?\\:\\/\\/([^\\/:?#]+)(?:[\\/:?#]|$)/ui)\nRun Code Online (Sandbox Code Playgroud)\nESLint 说Parsing error: Invalid regular expression: /^https?\\:\\/\\/([^\\/:?#]+)(?:[\\/:?#]|$)/: Invalid escape。
我不明白为什么这个正则表达式是错误的。我应该如何修复它?
\nu不必要的转义序列对于该标志无效\\:是不必要的转义序列。这些在使用标志时无效u。就用:代替吧。
这些是字符类之外的特殊字符的有效且必要的转义序列:\\$, \\(, \\), \\*, \\+, \\., \\?, \\[, \\\\, \\], \\^, \\{, \\|, \\}(所有\xe2\x80\x9csyntax 字符\xe2\x80\x9d)和\\/(特殊情况身份逃避)。
其他转义序列如\\ , \\!, \\", \\#, \\%, \\&, \\\', \\,, \\-, \\:, \\;, \\<, \\=, \\>, \\@, \\_, \\`,\\~是不必要的,因此对该u标志无效。
详细查看所有转义规则的规范。1
\n像RegEx101这样的工具报告这个 \xe2\x80\x8a\xe2\x80\x94\xe2\x80\x8aa 有点神秘,不过:
\n\n\n\n
/\\:/u:\n
\\:\xe2\x80\x8a\xe2\x80\x94\xe2\x80\x8a这个标记没有特殊含义,因此被渲染为错误
至于文档,我刚刚在 MDN 上的正则表达式备忘单中添加了一条注释:
\n\n\n请注意,某些字符(如
\n:、-、@等)在转义或未转义时均没有特殊含义。\n转义序列(如 , ,\\:)\\-将\\@等效于它们在正则表达式中的文字、未转义字符等效项。\n但是,在具有 unicode 的正则表达式中flag,这些将导致无效的身份转义错误。
注释继续:
\n\n\n这样做是为了确保与使用新转义序列(如
\n\\p或 )的现有代码向后兼容\\k。
当该功能被提出并引入时,提案\xe2\x80\x99s常见问题解答是这样说的:
\n\n\n向后兼容性怎么样?
\n在没有标志的正则表达式中
\nu,模式\\p是 的(不必要的)转义序列p。\n这种形式的模式\\p{Letter}可能已经存在于没有u标志的现有正则表达式中,因此我们无法在不破坏向后兼容性的情况下为此类模式分配新含义。因此,ECMAScript 2015 制作了不必要的转义序列,例如
\n\\p和在设置标志时\\P抛出异常。\n这使我们能够使用标志更改正则表达式中和u的含义,而不会破坏向后兼容性。\\p{\xe2\x80\xa6}\\P{\xe2\x80\xa6}u
此页面还链接自此ES 讨论线程,其中提出了此问题:
\n\n\n为什么 RegExp 是
\n/\\-/u语法错误?JSLint 之前警告过
\n-RegExp 中的未转义文字。\n但是,-与 unicode 标志一起转义u会导致 Chrome、Firefox 和 Edge 中出现语法错误(JSLint 已删除该警告)。\n只是好奇上述边缘情况的原因是一个语法错误。(我对语法进行了细微的调整。)
\n
回复链接到上述 GitHub 存储库以及该提案,但也以不同的方式解释了其基本原理:
\n\n\n将
\nu标志视为正则表达式的严格模式。
因此,每当您使用该u标志时,请记住这一点。\n一旦您使用 ,RegExp 的行为就会开始略有不同。u\n某些新事物变得有效,但某些其他事物也会变得无效。\n例如,另请参阅为什么是/[\\w-+]/有效的正则表达式但/[\\w-+]/u无效?。
1 : 您\xe2\x80\x99 将找到某些产生式规则,其中[U]的参数表示 Unicode 模式。\n请参阅语法符号参考来解码这些规则。
| 归档时间: |
|
| 查看次数: |
5630 次 |
| 最近记录: |