Javascript + Regex = Nada que repetir error?


Soy nuevo en Regex y estoy tratando de trabajar en uno de mis nuevos proyectos para ver si puedo aprenderlo y agregarlo a mi repitoire de habilidades. Sin embargo, estoy golpeando una barricada aquí.

Estoy tratando de ver si la entrada del usuario tiene caracteres ilegales usando la función .search de la siguiente manera:

if (name.search("[\[\]\?\*\+\|\{\}\\\(\)\@\.\n\r]") != -1) {
    ...
}

Sin embargo, cuando intento ejecutar la función que esta línea contiene, arroja el siguiente error para esa línea específica:

Uncaught SyntaxError: Invalid regular expression: /[[]?*+|{}\()@.

]/: Nothing to repeat

No puedo por mi vida ver lo que es mal con mi código. ¿Alguien puede indicarme la dirección correcta?

Author: esqew, 2011-06-09

3 answers

Necesita duplicar las barras invertidas utilizadas para escapar de los caracteres especiales de la expresión regular. Sin embargo, como @Bohemian señala, la mayoría de esas barras invertidas no son necesarias. Desafortunadamente, su respuesta sufre del mismo problema que la tuya. Lo que realmente quieres es:

La barra invertida está siendo interpretada por el código que lee la cadena, en lugar de pasarla al analizador de expresiones regulares. Usted quiere:

"[\\[\\]?*+|{}\\\\()@.\n\r]"

Observe la barra invertida cuadruplicada. Eso es definitivamente necesario. El la cadena pasada al compilador de expresiones regulares es entonces idéntica a la cadena de @Bohemian, y funciona correctamente.

 60
Author: andrewdski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-09 22:11:54

Construyendo a partir de @ Bohemian, creo que el enfoque más fácil sería simplemente usar un literal regex, por ejemplo:

if (name.search(/[\[\]?*+|{}\\()@.\n\r]/) != -1) {
    // ... stuff ...
}

Los literales de expresiones regulares son agradables porque no tienes que escapar del carácter de escape, y algunos IDE resaltarán expresiones regulares no válidas (muy útil para mí, ya que constantemente los arruino).

 6
Author: NobodyMan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-12 00:12:03

En primer lugar, en una clase de caracteres[...] la mayoría de los caracteres no necesitan escapar - son solo literales.

Por lo tanto, su expresión regular debe ser:

"[\[\]?*+|{}\\()@.\n\r]"

Esto compila para mí.

 2
Author: Bohemian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-09 22:10:59