Restricción de la longitud del carácter en la expresión regular

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

var test = /^(az|AZ|0-9)*[^$%^&*;:,?()\""\']*$/ //Works Fine 

En la parte superior, cuando bash restringir la longitud de los caracteres a 15, como a continuación, arroja un error.

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

Ayúdame a hacer que el regEx anterior funcione con el límite de caracteres a 15.

No puede aplicar cuantificadores a los anclajes. En su lugar, para restringir la longitud de la cadena de entrada , use una búsqueda anticipada anclada al principio:

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

Además, supongo que quería hacer coincidir 0 o más letras o dígitos con (az|AZ|0-9)* . Debería verse como [a-zA-Z0-9]* (es decir, usar una clase de caracteres aquí).

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

Los cuantificadores solo se aplican al subpatrón a la izquierda, ya sea un grupo o una clase de caracteres, 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. El ^(?:[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*){1,15}$ ” restringirá “la secuencia de 2 subpatrones de longitud ilimitada (como * (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?

El aspecto positivo (?=.{1,15}$) aparece justo después del anclaje ^ inicio de cadena. Es una aserción de ancho cero que solo devuelve verdadero o falso después de verificar si su subpatrón coincide con los caracteres siguientes. Por lo tanto, esta búsqueda intenta hacer coincidir cualquier 1 a 15 (debido al cuantificador limitante {1,15} ) caracteres, pero una línea nueva justo al final de la cadena (debido al $ ancla). Si eliminamos $ 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.

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

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