Restringir la longitud de los caracteres en una expresión regular

Resuelto Viku asked hace 9 años • 1 respuestas

Estoy usando la siguiente expresión regular sin restringir la longitud de los caracteres:

var test =  /^(a-z|A-Z|0-9)*[^$%^&*;:,<>?()\""\']*$/ // Works fine

En lo anterior, cuando intento restringir la longitud de los caracteres a 15 como se muestra a continuación, aparece un error.

var test =  /^(a-z|A-Z|0-9)*[^$%^&*;:,<>?()\""\']*${1,15}/    //**Uncaught SyntaxError: Invalid regular expression**

¿Cómo puedo hacer que la expresión regular anterior funcione con el límite de caracteres a 15?

Viku avatar Sep 09 '15 17:09 Viku
Aceptado

No se pueden aplicar cuantificadores a las anclas. En su lugar, para restringir la longitud de la cadena de entrada , utilice una búsqueda anticipada anclada al principio:

// ECMAScript (JavaScript, C++)
^(?=.{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*$
^^^^^^^^^^^

// Or, in flavors other than ECMAScript and Python
\A(?=.{1,15}\z)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*\z
^^^^^^^^^^^^^^^

// Or, in Python
\A(?=.{1,15}\Z)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*\Z
^^^^^^^^^^^^^^^

Además, supongo que deseaba hacer coincidir 0 o más letras o dígitos con (a-z|A-Z|0-9)*. Debería verse así [a-zA-Z0-9]*(es decir, use una clase de carácter aquí).

¿Por qué no utilizar un cuantificador limitante, como {1,15}al final?

Los cuantificadores sólo se aplican al subpatrón de la izquierda, ya sea un grupo, una clase de carácter o un símbolo literal. Por lo tanto, ^[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']{1,15}$restringirá efectivamente la longitud de la segunda clase de caracteres [^$%^&*;:,<>?()\"']de 1 a 15 caracteres. " Restringiremos ^(?:[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*){1,15}$" la secuencia de 2 subpatrones de longitud ilimitada (ya que *(y +también) pueden coincidir con un número ilimitado de caracteres) de 1 a 15 veces, y todavía no restringimos la longitud de toda la cadena de entrada .

¿Cómo funciona la restricción de anticipación?

La (?=.{1,15}$)// búsqueda anticipada positiva aparece justo después de (?=.{1,15}\z)/ ( nota en Ruby, es el único ancla que coincide solo con el inicio de toda la cadena) ancla de inicio de cadena . Es una afirmación de ancho cero que sólo devuelve verdadero o falso después de comprobar si su subpatrón coincide con los caracteres siguientes. Por lo tanto, esta búsqueda anticipada intenta hacer coincidir entre 1 y 15 caracteres (debido al cuantificador limitante ) pero una nueva línea justo al final de la cadena (debido al ancla // ). Si eliminamos el ancla // de la búsqueda anticipada, la búsqueda anticipada solo requerirá que la cadena contenga de 1 a 15 caracteres, pero la longitud total de la cadena puede ser cualquiera .(?=.{1,15}\Z) ^\A\A {1,15}$\z\Z$\z\Z

Si la cadena de entrada puede contener una secuencia de nueva línea, debe usar [\s\S]una construcción de expresión regular portátil de cualquier carácter (funcionará en JS y otros tipos de expresiones regulares comunes):

// ECMAScript (JavaScript, C++)
^(?=[\s\S]{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*$
 ^^^^^^^^^^^^^^^^^

// Or, in flavors other than ECMAScript and Python
\A(?=[\s\S]{1,15}\z)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*\z
  ^^^^^^^^^^^^^^^^^^

// Or, in Python
\A(?=[\s\S]{1,15}\Z)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*\Z
  ^^^^^^^^^^^^^^^^^^
Wiktor Stribiżew avatar Sep 09 '2015 10:09 Wiktor Stribiżew