Búsqueda de sitios web

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:

  1. Las aplicaciones internacionalizadas deben evitar string.toMayúsculas y string.aLowerCase. Utiliza una expresión regular que ignore el caso en su lugar. Por ejemplo, var needleRegExp=nuevo RegExp(needle, "i"); seguido de needleRegExp.test(pajar).
  2. En general, es posible que no conozcas el valor de needle. Ten cuidado de que needle no contenga ningún carácter especial de expresión regular. Escapa estos usando needle.replace(/[-[\\]{}()*+?.,\\^$|#\s]/g, "\\$");.
  3. En otros casos, si quieres hacer coincidir exactamente needle y haystack, 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);

Artículos relacionados