为什么我的正则表达式对于 RegExp u 标志有效,但对于 v 标志无效,并且在 HTML 模式属性中不起作用?

Duc*_*oup 10 html javascript regex html-input ecmascript-next

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

^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+$
Run Code Online (Sandbox Code Playgroud)

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标志有效

Wik*_*żew 22

问题是编译 RegExp 对象时会自动使用HTML属性中新引入的v标志pattern

提供给属性的值pattern将转换为带有unicode 集v标志的正则表达式。

属性<input> pattern参考指出

输入元素的已编译模式正则表达式(如果存在)是一个 JavaScript对象。其确定如下:RegExp

  1. 如果该元素没有pattern指定属性,则不返回任何内容。该元素没有编译模式正则表达式

  2. patternpattern为元素属性的值。

  3. regexpCompletionRegExpCreate ( pattern , "v")。

  4. 如果regexpCompletion突然完成,则不返回任何内容。该元素没有编译模式正则表达式
    注意:鼓励用户代理在开发人员控制台中记录此错误,以帮助调试。

  5. anchoredPattern为字符串“ ^(?:”,后跟pattern,再后跟“ )$”。

  6. 返回 !RegExpCreate锚定模式,“v”)。

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

所以,如果使用uflag,就没有这样的限制,有了vflag,就到位了。比照。

console.log(/^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$/u.test("myname@somesite.com"))
console.log(/^[a-zA-Z0-9+_.\-]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$/v.test("myname@somesite.com"))
Run Code Online (Sandbox Code Playgroud)

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

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

一些以前有效的模式现在是错误的,特别是那些具有包含未转义特殊字符 ( ) [ { } / - |(注意:\并且]还需要在字符类内部转义,但对于 u 标志已经如此)或双标点符号的字符类的模式

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