javascript - Búsqueda sin distinguir mayúsculas y minúsculas
Estoy tratando de hacer que una búsqueda que no distinga entre mayúsculas y minúsculas con dos cadenas funcione en JavaScript.
Normalmente sería así:
var string="Stackoverflow is the BEST";
var result= string.search(/best/i);
alert(result);
La bandera /i sería para no distinguir entre mayúsculas y minúsculas.
Pero necesito buscar una segunda cadena; sin la bandera funciona perfecto:
var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(searchstring);
alert(result);
Si agrego la bandera /i al ejemplo anterior, buscaría searchstring y no lo que está en la variable "searchstring" (el siguiente ejemplo no funciona):
var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(/searchstring/i);
alert(result);
¿Cómo puedo lograr esto?
Respuesta #1
Sí, usa .match en lugar de .search. El resultado de la llamada .match devolverá la cadena real que coincidió, pero aún así puede usarse como un valor booleano.
var string = "Stackoverflow is the BEST";
var result = string.match(/best/i);
// result == 'BEST';
if (result){
alert('Matched');
}
Usar una expresión regular como esa es probablemente la manera más ordenada y obvia de hacer eso en JavaScript, pero ten en cuenta que es una expresión regular, y por lo tanto puede contener metacaracteres de regex. Si quieres tomar la cadena de otro lugar (por ejemplo, la entrada del usuario), o si quieres evitar tener que escapar muchos metacaracteres, entonces probablemente sea mejor usar indexOf así:
matchString = 'best';
// If the match string is coming from user input you could do
// matchString = userInput.toLowerCase() here.
if (string.toLowerCase().indexOf(matchString) != -1){
alert('Matched');
}
Respuesta #2
Reemplazar
var result= string.search(/searchstring/i);
con
var result= string.search(new RegExp(searchstring, "i"));
Respuesta #3
Si solo estás buscando una cadena en lugar de una expresión regular más complicada, puedes usar indexOf(), pero recuerda poner ambas cadenas en minúsculas primero porque indexOf() distingue entre mayúsculas y minúsculas:
var string="Stackoverflow is the BEST";
var searchstring="best";
// lowercase both strings
var lcString=string.toLowerCase();
var lcSearchString=searchstring.toLowerCase();
var result = lcString.indexOf(lcSearchString)>=0;
alert(result);
O en una sola línea:
var result = string.toLowerCase().indexOf(searchstring.toLowerCase())>=0;
Respuesta #4
Supongamos que queremos encontrar la variable de cadena needle en la variable de cadena haystack. Hay tres detalles a tener en cuenta:
- Las aplicaciones internacionalizadas deben evitar
string.toMayúsculasystring.aLowerCase. Utiliza una expresión regular que ignore el caso en su lugar. Por ejemplo,var needleRegExp=nuevo RegExp(needle, "i");seguido deneedleRegExp.test(pajar). - En general, es posible que no conozcas el valor de
needle. Ten cuidado de queneedleno contenga ningún carácter especial de expresión regular. Escapa estos usandoneedle.replace(/[-[\\]{}()*+?.,\\^$|#\s]/g, "\\$");. - En otros casos, si quieres hacer coincidir exactamente
needleyhaystack, simplemente ignorando mayúsculas y minúsculas, asegúrate de agregar"^"al inicio y"$"al final de tu constructor de expresiones regulares.
Tomando en consideración los puntos (1) y (2), un ejemplo sería:
var haystack = "A. BAIL. Of. Hay.";
var needle = "bail.";
var needleRegExp = new RegExp(needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), "i");
var result = needleRegExp.test(haystack);
alert(result);
