为什么我的正则表达式对 RegExp u 标志有效,但对 v 标志无效?

问题描述 投票:0回答:1

我收到此正则表达式模式的以下控制台警告:

^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+$

Pattern 属性值

^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$
对于 RegExp
u
标志有效,但对于
v
标志无效:未捕获语法错误:无效正则表达式:
/^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9]+\
[a-zA-Z0-9]+$/v:
字符类中的字符无效。

我看不到如何为此警告创建有效的正则表达式模式。请问有人可以解释一下这个错误以及如何解决它吗?

尝试查看文档,但无法了解如何使其对

v
标志有效

javascript regex ecmascript-next
1个回答
18
投票

问题在于,新引入的

v
标志对转义规则应用了更多限制。由于 它允许字符类减法和交集,因此字符类末尾的 literal
-
不能不转义。

所以,如果您使用

u
标志,则没有这样的限制,使用
v
标志,它就到位了。参见

console.log(/^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$/u.test("[email protected]"))
console.log(/^[a-zA-Z0-9+_.\-]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$/v.test("[email protected]"))

因此,在 ECMAScript 模式中始终转义字符类中的文字连字符。

以下是有关哪些模式现在被视为无效的更多详细信息:

一些以前有效的模式现在是错误,特别是那些字符类包含未转义的特殊字符

(
)
[
{
}
/
-
|
(注意:
\
]
也需要在字符类中转义,但这对于 u 标志来说已经是这样了)或 双标点符号:

[(]
[)]
[[]
[{]
[}]
[/]
[-]
[|]
[&&]
[!!]
[##]
[$$]
[%%]
[**]
[++]
[,,]
[..]
[::]
[;;]
[<<]
[==]
[>>]
[??]
[@@]
[``]
[~~]
[^^^]
[_^^]
© www.soinside.com 2019 - 2024. All rights reserved.