2008-10-07 32 views
235

Estoy tratando de obtener una búsqueda insensible a mayúsculas/minúsculas con dos cadenas en JavaScript trabajando.JavaScript: búsqueda insensible a mayúsculas/minúsculas

Normalmente sería así:

var string="Stackoverflow is the BEST"; 
var result= string.search(/best/i); 
alert(result); 

La bandera /i sería de entre mayúsculas y minúsculas.

Pero necesito buscar una segunda cadena; sin el indicador funciona perfecto:

var string="Stackoverflow is the BEST"; 
var searchstring="best"; 
var result= string.search(searchstring); 
alert(result); 

Si añado la bandera /i al ejemplo anterior sería buscar searchstring y no para lo que está en la "searchstring" variable (ejemplo siguiente 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

317

Sí, use .match, en lugar de .search. El resultado de la llamada .match devolverá la cadena real que se combinó, pero aún se puede usar como un valor booleano.

var string = "Stackoverflow is the BEST"; 
var result = string.match(/best/i); 
// result == 'BEST'; 

if (result){ 
    alert('Matched'); 
} 

Utilizar una expresión regular como que es probablemente la manera más ordenada y más obvia de hacerlo en JavaScript, pero hay que tener en cuenta que es una expresión regular, y por lo tanto puede contener metacaracteres de expresiones regulares. Si usted quiere tomar la cadena desde otro lugar (por ejemplo, la entrada del usuario), o si se quiere evitar tener que escapar de una gran cantidad de meta-caracteres, entonces usted está probablemente 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'); 
} 
+11

¿Qué pasa si matchString tiene un valor de "mejor"? La búsqueda adecuada insensible a mayúsculas y minúsculas aún debe encontrar la ocurrencia. En su caso, probablemente también necesite llamar a LowCase() en el término de búsqueda también. –

+0

Agregué un comentario para reflejar ese hecho, gracias. – Dan

+7

Disculpe, ¿cómo puede convertir "lo mejor" en una variable en su primer ejemplo? '' 'string.match (/ best/i);' '' –

138

Reemplazar

var result= string.search(/searchstring/i); 

con

var result= string.search(new RegExp(searchstring, "i")); 
+5

Esa es una forma bastante desordenada, ya que toma medidas para protegerse contra los metacaracteres de expresiones regulares inesperados. – Dan

+30

Dan, dudo que mi respuesta merezca -1 de ti. Intenté ayudar a ChrisBo corrigiendo su uso incorrecto de JavaScript, a saber: var result = string.search (/ searchstring/i); a uno adecuado, donde la cadena de búsqueda variable se usó de la manera que él pretendía. –

+7

Dan tiene razón (aunque probablemente quiso decir "* no * measures"): 's = 'a [b'; r = new RegExp (s) 'da como resultado un error de sintaxis (clase de carácter sin terminar) –

33

Si acaba de buscar una cadena en lugar de una expresión regular más complicado, puede utilizar indexOf() - pero recordar a minúsculas ambas cadenas en primer lugar porque indexOf() 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; 
2

Si usted está preocupado por el caso "sin terminar clase de caracteres", la eliminación de todos no alfanumérico caracteres serían útiles:

searchstring = searchstring.replace(/[^a-zA-Z 0-9]+/g,'');
-1

me di cuenta de que si el usuario introduce una cadena de texto, pero deja la entrada sin seleccionar cualquiera de las opciones de autocompletar ningún valor se establece en la entrada oculta, incluso si la cadena coincide con una en la matriz. Así, con la ayuda de las otras respuestas que hice esto:

var $local_source = [{ 
     value: 1, 
     label: "c++" 
    }, { 
     value: 2, 
     label: "java" 
    }, { 
     value: 3, 
     label: "php" 
    }, { 
     value: 4, 
     label: "coldfusion" 
    }, { 
     value: 5, 
     label: "javascript" 
    }, { 
     value: 6, 
     label: "asp" 
    }, { 
     value: 7, 
     label: "ruby" 
    }]; 
    $('#search-fld').autocomplete({ 
     source: $local_source, 
     select: function (event, ui) { 
      $("#search-fld").val(ui.item.label); // display the selected text 
      $("#search-fldID").val(ui.item.value); // save selected id to hidden input 
      return false; 
     }, 
     change: function(event, ui) { 

      var isInArray = false; 

      $local_source.forEach(function(element, index){ 

       if ($("#search-fld").val().toUpperCase() == element.label.toUpperCase()) { 
        isInArray = true; 
        $("#search-fld").val(element.label); // display the selected text 
        $("#search-fldID").val(element.value); // save selected id to hidden input 
        console.log('inarray: '+isInArray+' label: '+element.label+' value: '+element.value); 
       }; 

      }); 

      if(!isInArray){ 

       $("#search-fld").val(''); // display the selected text 
       $("#search-fldID").val(ui.item? ui.item.value : 0); 

      } 
     } 
1

Hay dos maneras para el caso de la comparación insensible:

  1. cuerdas Convertir a mayúsculas y luego compararlas con el operador estricta (===). Cómo estricta operador trata operandos leen cosas en: http://www.thesstech.com/javascript/relational-logical-operators

  2. Coincidencia de patrones utilizando métodos de cadena:

    Uso de la "búsqueda" método de cadena de búsqueda que ignore. leer acerca de búsqueda y otros métodos de cadena en: http://www.thesstech.com/pattern-matching-using-string-methods

    <!doctype html> 
        <html> 
        <head> 
         <script> 
    
         // 1st way 
    
         var a = "apple"; 
         var b = "APPLE"; 
         if (a.toUpperCase() === b.toUpperCase()) { 
          alert("equal"); 
         } 
    
         //2nd way 
    
         var a = " Null and void"; 
         document.write(a.search(/null/i)); 
    
         </script> 
        </head> 
    </html> 
    
14

Supongamos que queremos encontrar la variable de cadena needle en la variable de cadena haystack. Hay tres aspectos críticos:

  1. aplicaciones internacionalizados deben evitar string.toUpperCase y string.toLowerCase. Use una expresión regular que ignore el caso en su lugar. Por ejemplo, var needleRegExp = new RegExp(needle, "i"); seguido de needleRegExp.test(haystack).
  2. En general, es posible que no conozca el valor de needle. Tenga cuidado de que needle no contenga ninguna expresión regular special characters. Escape estos usando needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");.
  3. En otros casos, si quiere emparejar con precisión needle y haystack, simplemente ignorando la caja, asegúrese de agregar "^" al comienzo y "$" al final de su constructor de expresión regular.

Tomar puntos (1) y (2) en consideración, 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); 
+1

Soy terrible con RegExp, pero ¿no debería ser 'RegExp (needle.replace..'? Then' .test (haystack); '? – Todd

+0

@todd, sin duda tiene razón. Consulte las ediciones. –

2

me gusta @ respuesta de CHR15TO, a diferencia de otras respuestas que he visto en otras preguntas similares, esa respuesta en realidad muestra cómo escapar correctamente una cadena de búsqueda proporcionada por el usuario (en lugar de decir que sería necesario sin mostrar cómo).

Sin embargo, todavía es bastante torpe, y posiblemente relativamente más lento. Entonces, ¿por qué no tener una solución específica para lo que probablemente es un requisito común para los codificadores? (Y por qué no incluirlo en la API ES6 cierto?)

Mi respuesta [https://stackoverflow.com/a/38290557/887092] sobre una cuestión similar permite lo siguiente:

var haystack = 'A. BAIL. Of. Hay.'; 
var needle = 'bail.'; 
var index = haystack.naturalIndexOf(needle); 
Cuestiones relacionadas