对 RegExp u 标志有效,但对 v 标志无效

Valid with the RegExp u flag, but not with the v flag

提问人:DuckSoup 提问时间:5/19/2023 最后编辑:DSDmarkDuckSoup 更新时间:5/20/2023 访问量:3768

问:

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

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

Pattern 属性值对 RegExp 标志有效,但对标志无效:Uncaught SyntaxError: Invalid regular expression: 无效。字符类中的字符无效。^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$uv/^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9]+\[a-zA-Z0-9]+$/v:

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

尝试查看文档,但看不到如何使其对标志有效v

javascript 正则表达式 ecmascript-next

评论

2赞 qrsngky 5/19/2023
将第一个更改为 ?-\-

答:

19赞 Wiktor Stribiżew 5/19/2023 #1

问题在于,新引入的 v 标志对转义规则施加了更多限制。由于它允许字符类减法和交集,因此字符类末尾的文字不能不转义。-

所以,如果你使用标志,就没有这样的限制,有了标志,它就到位了。参看。uv

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 标志)或双标点符号的模式:()[{}/-|\]

[(]
[)]
[[]
[{]
[}]
[/]
[-]
[|]
[&&]
[!!]
[##]
[$$]
[%%]
[**]
[++]
[,,]
[..]
[::]
[;;]
[<<]
[==]
[>>]
[??]
[@@]
[``]
[~~]
[^^^]
[_^^]

评论

1赞 oriberu 5/19/2023
很高兴知道。您提供的链接中的这一小节专门讨论了手头的问题:v 标志与 u 标志有何不同?
0赞 Wiktor Stribiżew 5/19/2023
@oriberu我在问题中添加了这些相关细节,那肯定会有所帮助。
0赞 TylerH 12/17/2023
这个答案可以通过解释为什么控制台/解析器警告 OP 他们没有明确包含在其正则表达式模式中的标志而受益。特别是因为这不是他们问的,而且你把标题改成了关于那些旗帜的。否则,可能需要还原标题。