不必要的转义序列对于以下内容无效u
flag
\:
是不必要的转义序列。那些是invalid当使用u
旗帜。只需使用:
反而。
规范、调试器、文档
这些是字符类之外的特殊字符的有效且必要的转义序列:\$
, \(
, \)
, \*
, \+
, \.
, \?
, \[
, \\
, \]
, \^
, \{
, \|
, \}
(all “语法字符” https://tc39.es/ecma262/#prod-SyntaxCharacter), and \/
(特殊情况是身份逃避 https://tc39.es/ecma262/#prod-IdentityEscape).
其他转义序列如\
, \!
, \"
, \#
, \%
, \&
, \'
, \,
, \-
, \:
, \;
, \<
, \=
, \>
, \@
, \_
, \`
, \~
是不必要的,因此无效u
flag.
Look into the specification https://tc39.es/ecma262/#prod-AtomEscape for all the escaping rules in detail.1
类似的工具RegEx101 https://regex101.com/报告这个 — 不过有点神秘:
/\:/u
:
\:
— 此标记没有特殊含义,因此被认为是错误的
至于文档,我有just now在中添加了注释MDN 上的正则表达式备忘单 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Cheatsheet:
请注意,有些字符例如:
, -
, @
等在转义或未转义时都没有特殊含义。
转义序列如\:
, \-
, \@
将等价于正则表达式中它们的字面量、未转义字符等价物。
然而,在正则表达式中统一码标志 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Advanced_searching_with_flags_2,这些都会导致无效身份转义 error.
基本原理
注释继续:
这样做是为了确保与使用新转义序列的现有代码向后兼容,例如\p
or \k
.
当该功能被提出并引入时,这就是提案的常见问题解答 https://github.com/tc39/proposal-regexp-unicode-property-escapes#what-about-backwards-compatibility不得不说:
向后兼容性怎么样?
在正则表达式中不带u
旗帜、图案\p
是一个(不必要的)转义序列p
。
表格的图案\p{Letter}
可能已经存在于现有的正则表达式中,而无需u
标志,因此我们不能在不破坏向后兼容性的情况下为这些模式分配新的含义。
因此,ECMAScript 2015 制作了不必要的转义序列,例如\p
and \P
抛出异常 https://tc39.es/archives/bugzilla/3157/当。。。的时候u
标志已设置。
这使我们能够改变\p{…}
and \P{…}
在正则表达式中u
标志而不破坏向后兼容性。
此页面也链接自此ES 讨论话题 https://esdiscuss.org/topic/why-is-regexp-u-a-syntax-error提出这个问题的地方:
为什么是正则表达式/\-/u
语法错误?
JSLint 之前警告过未转义的文字-
在正则表达式中。
然而,逃脱-
与 unicode 标志一起u
在 Chrome、Firefox 和 Edge 中导致语法错误(JSLint 已删除该警告)。
只是好奇上述边缘情况是语法错误的原因。
(我对语法进行了细微的调整。)
回复链接到上述 GitHub 存储库以及该提案,但也以不同的方式解释了其基本原理:
想想u
标记为正则表达式的严格模式。
因此,每当您使用u
旗帜,记住这一点。
一旦您使用正则表达式,其行为就会开始有些不同u
。
某些新事物变得有效,但某些其他事物也变得无效。
例如,另请参阅Why is /[\w-+]/一个有效的正则表达式但是/[\w-+]/u无效的? https://stackoverflow.com/q/54205197/4642212.
1: You’ll find certain production rules with [U]
which is a parameter that represents Unicode patterns.
See the grammar notation reference https://tc39.es/ecma262/#sec-grammar-notation for decoding these.