Quiero hacer una búsqueda de cadenas dentro de una cadena. Simplemente diciendo MySTR.search(Needle)
.Cómo escaparse correctamente de los caracteres en la expresión regular
El problema se produce cuando esta cadena needle
contiene caracteres especiales de expresiones regulares como *, + y así sucesivamente. Falla con el error invalid quantifier
.
He navegado por la web y he descubierto que la cadena se puede escapar con \Q some string \E
.
Sin embargo, esto no siempre produce el comportamiento deseado. Por ejemplo:
var sNeedle = '*Stars!*';
var sMySTR = 'The contents of this string have no importance';
sMySTR.search('\Q' + sNeedle + '\E');
El resultado es -1. DE ACUERDO.
var sNeedle = '**Stars!**';
var sMySTR = 'The contents of this string have no importance';
sMySTR.search('\Q' + sNeedle + '\E');
El resultado es "cuantificador no válido". Esto sucede porque 2 o más caracteres especiales se 'tocan' entre sí, porque:
var sNeedle = '*Dont touch me*Stars!*Dont touch me*';
var sMySTR = 'The contents of this string have no importance';
sMySTR.search('\Q' + sNeedle + '\E');
Funcionará correctamente.
Sé que podría hacer una función escapeAllBadChars(sInStr)
y simplemente agregar barras diagonales dobles antes de cada posible carácter especial de expresiones regulares, pero me pregunto si hay una forma más sencilla de hacerlo.
\ Q ... \ E trabaja en Perl, no está seguro acerca en cualquier otro lugar sin embargo. –
Creo que las estrellas en su tercer ejemplo no están haciendo lo que usted piensa. No se interpretan como caracteres literales *, sino como cuantificadores para los personajes que los precedieron. –
@Matthew, en Java funciona igual que en Perl (no estoy seguro acerca de otros lenguajes). –