Como hemos visto, una barra invertida \ se usa para denotar clases de caracteres, p.ej. \d. Por lo tanto, es un carácter especial en expresiones regulares (al igual que en las cadenas regulares).
También hay otros caracteres especiales que tienen un significado especial en una expresión regular, tales como [ ] { } ( ) \ ^ $ . | ? * +. Se utilizan para hacer búsquedas más potentes.
No intentes recordar la lista: pronto nos ocuparemos de cada uno de ellos por separado y los recordarás fácilmente.
Escapando
Digamos que queremos encontrar literalmente un punto. No âcualquier carácterâ, sino solo un punto.
Para usar un carácter especial como uno normal, agrégalo con una barra invertida: \..
A esto se le llama âescape de carácterâ.
Por ejemplo:
alert( "CapÃtulo 5.1".match(/\d\.\d/) ); // 5.1 (¡Coincide!)
alert( "CapÃtulo 511".match(/\d\.\d/) ); // null (buscando un punto real \.)
Los paréntesis también son caracteres especiales, por lo que si los buscamos, deberÃamos usar \(. El siguiente ejemplo busca una cadena "g()":
alert( "función g()".match(/g\(\)/) ); // "g()"
Si estamos buscando una barra invertida \, como es un carácter especial tanto en cadenas regulares como en expresiones regulares, debemos duplicarlo.
alert( "1\\2".match(/\\/) ); // '\'
Una barra
Un sÃmbolo de barra '/' no es un carácter especial, pero en JavaScript se usa para abrir y cerrar expresiones regulares: /...pattern.../, por lo que también debemos escaparlo.
Asà es como se ve la búsqueda de una barra '/':
alert( "/".match(/\//) ); // '/'
Por otro lado, si no estamos usando /.../, pero creamos una expresión regular usando new RegExp, entonces no necesitamos escaparla:
alert( "/".match(new RegExp("/")) ); // encuentra /
new RegExp
Si estamos creando una expresión regular con new RegExp, entonces no tenemos que escapar la barra /, pero sà otros caracteres especiales.
Por ejemplo, considere esto:
let regexp = new RegExp("\d\.\d");
alert( "CapÃtulo 5.1".match(regexp) ); // null
En uno de los ejemplos anteriores funcionó la búsqueda con /\d\.\d/, pero new RegExp ("\d\.\d") no funciona, ¿por qué?
La razón es que las barras invertidas son âconsumidasâ por una cadena. Como podemos recordar, las cadenas regulares tienen sus propios caracteres especiales, como \n, y se usa una barra invertida para escapar esos caracteres especiales de cadena.
Asà es como se percibe "\d.\d":
alert("\d\.\d"); // d.d
Las comillas de cadenas âconsumenâ barras invertidas y las interpretan como propias, por ejemplo:
\nâ se convierte en un carácter de lÃnea nueva,\u1234â se convierte en el carácter Unicode con dicho código,- â¦Y cuando no hay un significado especial: como
\do\z, entonces la barra invertida simplemente se elimina.
Asà que new RegExp toma una cadena sin barras invertidas. ¡Por eso la búsqueda no funciona!
Para solucionarlo, debemos duplicar las barras invertidas, porque las comillas de cadena convierten \\ en \:
let regStr = "\\d\\.\\d";
alert(regStr); // \d\.\d (ahora está correcto)
let regexp = new RegExp(regStr);
alert( "CapÃtulo 5.1".match(regexp) ); // 5.1
Resumen
- Para buscar literalmente caracteres especiales
[ \ ^ $ . | ? * + ( ), se les antepone una barra invertida\(âescaparlosâ). - Se debe escapar
/si estamos dentro de/.../(pero no dentro denew RegExp). - Al pasar una cadena a
new RegExp, se deben duplicar las barras invertidas\\, porque las comillas de cadena consumen una.
Comentarios
<code>, para varias lÃneas â envolverlas en la etiqueta<pre>, para más de 10 lÃneas â utilice una entorno controlado (sandbox) (plnkr, jsbin, codepenâ¦)