Restringir la longitud de los caracteres en una expresión regular
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?
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
^^^^^^^^^^^^^^^^^^