Restricción de la longitud de los caracteres en la expresión regular

3 minutos de lectura

Restriccion de la longitud de los caracteres en la
Vikú

Estoy usando la siguiente expresión regular sin restringir la longitud de ningún carácter

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

Arriba, cuando trato de restringir la longitud de los caracteres a 15 como se muestra a continuación, arroja un error.

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

Ayúdenme a hacer que la expresión regular anterior funcione con el límite de caracteres de 15.

Restriccion de la longitud de los caracteres en la
Wiktor Stribiżew

No puede aplicar cuantificadores a las anclas. En lugar de, para restringir la longitud de la cadena de entradause 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 quería hacer coincidir 0 o más letras o dígitos con (a-z|A-Z|0-9)*. debería verse como [a-zA-Z0-9]* (es decir, use una clase de carácter aquí).

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

Los cuantificadores solo 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. los ^(?:[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*){1,15}$ “restringirá” la secuencia de 2 subpatrones de longitud ilimitada (como el * (y +también) puede coincidir con un número ilimitado de caracteres) de 1 a 15 veces, y todavía no restringimos la longitud de la cadena de entrada completa.

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

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

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

// 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
  ^^^^^^^^^^^^^^^^^^

  • No estoy realmente seguro de que necesites esta expresión regular. Coincidirá con 0 o más letras o dígitos, y luego con 0 o más caracteres distintos a los del $%^&*;:,<>?()"' colocar. Aclare qué cadenas son válidas (que desea hacer coincidir) y cuáles no.

    – Wiktor Stribiżew

    9 sep 2015 a las 10:41


  • Si tiene símbolos de nueva línea en su cadena, reemplace la primera búsqueda anticipada con (?=[\s\S]{1,15}$).

    – Wiktor Stribiżew

    9 sep 2015 a las 13:10

  • En C #, el anterior no funcionará cuando intente asignar el regEx a una cadena. ¿Necesito hacer esto ^(?=. {1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\””‘]PS

    – Vikú

    10/09/2015 a las 11:51


  • Funcionará si usa un literal de cadena normal. Con literal de cadena literal, se verá como var rx = new Regex(@"^(?=.{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()""']*$").

    – Wiktor Stribiżew

    10 de septiembre de 2015 a las 12:26

  • @Maximus El principio de contraste es una forma adecuada de seguir su patrón. Sin embargo, no se trata de restringir la longitud de la cadena de entrada, es un problema de validación específico. Esta expresión regular no funcionará en JS, por cierto.

    – Wiktor Stribiżew

    3 de marzo de 2016 a las 11:56


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad