¿Por qué mi expresión regular es válida con el indicador RegExp u, pero no con el indicador v y no funciona en el atributo de patrón HTML?
Recibo la siguiente advertencia de la consola para este patrón de expresiones regulares:
^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+$
El valor del atributo del patrón
^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$
es válido con elu
indicador RegExp, pero no con elv
indicador:
Error de sintaxis no detectado: expresión regular no válida:/^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$/v:
carácter no válido en la clase de caracteres.
No veo cómo crear un patrón de expresiones regulares válido para esta advertencia. Por favor, ¿alguien podría explicarme el error y cómo solucionarlo?
Intenté mirar la documentación, pero no pude ver cómo hacerla válida para la v
bandera.
El problema es que el indicador recién introducidov
dentro del pattern
atributo HTML se usa automáticamente al compilar un objeto RegExp.
El valor proporcionado a un pattern
atributo se convierte en una expresión regular con la v
bandera para conjuntos Unicode .
La <input>
pattern
referencia del atributo dice :
La expresión regular del patrón compilado de un elemento de entrada , si existe, es un
RegExp
objeto JavaScript. Se determina de la siguiente manera:
Si el elemento no tiene un
pattern
atributo especificado, no devuelve nada. El elemento no tiene una expresión regular de patrón compilado .Sea patrón el valor del
pattern
atributo del elemento.Deje que regexpCompletion sea RegExpCreate ( patrón , "v").
Si regexpCompletion es una finalización abrupta , no devuelve nada. El elemento no tiene una expresión regular de patrón compilado .
Nota: Se recomienda a los agentes de usuario que registren este error en una consola de desarrollador para ayudar en la depuración.Sea AnchoredPattern la cadena "
^(?:
", seguida de patrón y seguida de ")$
".Devolver ! RegExpCreate ( patrón anclado , "v").
La /v
bandera aplica aún más restricciones para escapar de las reglas. Dado que permite la resta e intersección de clases de caracteres , el literal -
al final de una clase de caracteres no se puede dejar sin escape.
Entonces, si usa la u
bandera, no existe tal restricción; con la v
bandera, está vigente. Cfr.
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]"))
Por lo tanto, escape siempre los guiones literales dentro de las clases de caracteres en los patrones ECMAScript.
Aquí hay más detalles sobre qué patrones ahora se consideran no válidos:
Algunos patrones anteriormente válidos ahora son errores , específicamente aquellos con una clase de carácter que incluye un carácter especial
(
)
[
{
}
/
-
|
sin escape (nota:\
y]
también requiere escape dentro de una clase de carácter, pero esto ya es cierto con la bandera u) o un doble puntuador :
[(] [)] [[] [{] [}] [/] [-] [|] [&&] [!!] [##] [$$] [%%] [**] [++] [,,] [..] [::] [;;] [<<] [==] [>>] [??] [@@] [``] [~~] [^^^] [_^^]