¿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?

Resuelto DuckSoup asked hace 1 año • 1 respuestas

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 el uindicador RegExp, pero no con el vindicador:
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 vbandera.

DuckSoup avatar May 19 '23 09:05 DuckSoup
Aceptado

El problema es que el indicador recién introducidov dentro del patternatributo HTML se usa automáticamente al compilar un objeto RegExp.

El valor proporcionado a un patternatributo se convierte en una expresión regular con la vbandera para conjuntos Unicode .

La <input> patternreferencia del atributo dice :

La expresión regular del patrón compilado de un elemento de entrada , si existe, es un RegExpobjeto JavaScript. Se determina de la siguiente manera:

  1. Si el elemento no tiene un patternatributo especificado, no devuelve nada. El elemento no tiene una expresión regular de patrón compilado .

  2. Sea patrón el valor del patternatributo del elemento.

  3. Deje que regexpCompletion sea RegExpCreate ( patrón , "v").

  4. 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.

  5. Sea AnchoredPattern la cadena " ^(?:", seguida de patrón y seguida de " )$".

  6. Devolver ! RegExpCreate ( patrón anclado , "v").

La /vbandera 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 ubandera, no existe tal restricción; con la vbandera, 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]"))
Expandir fragmento

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 :

[(]
[)]
[[]
[{]
[}]
[/]
[-]
[|]
[&&]
[!!]
[##]
[$$]
[%%]
[**]
[++]
[,,]
[..]
[::]
[;;]
[<<]
[==]
[>>]
[??]
[@@]
[``]
[~~]
[^^^]
[_^^]
Wiktor Stribiżew avatar May 19 '2023 08:05 Wiktor Stribiżew