javascript - sensitive - Búsqueda insensible a mayúsculas
localecompare (10)
ES6 +:
let string="Stackoverflow is the BEST";
let searchstring="best";
let found = string.toLowerCase()
.includes(searchstring.toLowerCase());
includes()
devuelve true
si searchString
aparece en una o más posiciones o false
contrario.
Estoy intentando obtener una búsqueda que no distinga mayúsculas de minúsculas con dos cadenas en JavaScript funcionando
Normalmente sería así:
var string="Stackoverflow is the BEST";
var result= string.search(/best/i);
alert(result);
La /i
sería para 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 el indicador /i
al ejemplo anterior, buscaría la cadena de búsqueda y no la variable "cadena de búsqueda" (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 conseguir esto?
Hago esto a menudo y uso un prototipo simple de 5 líneas que acepta varargs. Es rápido y funciona en todas partes .
myString.containsIgnoreCase(''red'',''orange'',''yellow'')
/**
* @param {...string} var_strings Strings to search for
* @return {boolean} true if ANY of the arguments is contained in the string
*/
String.prototype.containsIgnoreCase = function(var_strings) {
const thisLowerCase = this.toLowerCase()
for (let i = 0; i < arguments.length; i++) {
let needle = arguments[i]
if (thisLowerCase.indexOf(needle.toLowerCase()) >= 0) {
return true
}
}
return false
}
/**
* @param {...string} var_strings Strings to search for
* @return {boolean} true if ALL of the arguments are contained in the string
*/
String.prototype.containsAllIgnoreCase = function(var_strings) {
const thisLowerCase = this.toLowerCase()
for (let i = 0; i < arguments.length; i++) {
let needle = arguments[i]
if (thisLowerCase.indexOf(needle.toLowerCase()) === -1) {
return false
}
}
return true
}
// Unit test
let content = `
FIRST SECOND
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
FOO BAR
`
let data = [
''foo'',
''Foo'',
''foobar'',
''barfoo'',
''first'',
''second''
]
let result
data.forEach(item => {
console.log(''Searching for'', item)
result = content.containsIgnoreCase(item)
console.log(result ? ''Found'' : ''Not Found'')
})
console.log(''Searching for'', ''x, y, foo'')
result = content.containsIgnoreCase(''x'', ''y'', ''foo'');
console.log(result ? ''Found'' : ''Not Found'')
console.log(''Searching for all'', ''foo, bar, foobar'')
result = content.containsAllIgnoreCase(''foo'', ''bar'', ''foobar'');
console.log(result ? ''Found'' : ''Not Found'')
console.log(''Searching for all'', ''foo, bar'')
result = content.containsAllIgnoreCase(''foo'', ''bar'');
console.log(result ? ''Found'' : ''Not Found'')
Hay dos formas de comparación entre mayúsculas y minúsculas:
Convierta cadenas a mayúsculas y luego compárelas con el operador estricto (
===
). Cómo el operador estricto trata a los operandos, lea cosas en: http://www.thesstech.com/javascript/relational-logical-operatorsCoincidencia de patrones utilizando métodos de cadena:
Utilice el método de cadena de "búsqueda" para la búsqueda no sensible a mayúsculas Lea acerca de la 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>
Me gusta la respuesta de @ CHR15TO, a diferencia de otras respuestas que he visto en otras preguntas similares, esa respuesta realmente muestra cómo escapar de una cadena de búsqueda proporcionada por el usuario (en lugar de decir que sería necesaria sin mostrar cómo).
Sin embargo, sigue siendo bastante torpe, y posiblemente relativamente más lento. Entonces, ¿por qué no tener una solución específica a lo que probablemente sea un requisito común para los codificadores? (¿Y por qué no incluirlo en la API ES6 BTW?)
Mi respuesta [ https://.com/a/38290557/887092] en una pregunta similar permite lo siguiente:
var haystack = ''A. BAIL. Of. Hay.'';
var needle = ''bail.'';
var index = haystack.naturalIndexOf(needle);
Noté que si el usuario ingresa una cadena de texto pero deja la entrada sin seleccionar ninguna de las opciones de autocompletar, no se establece ningún valor en la entrada oculta, incluso si la cadena coincide con una en la matriz. Entonces, con la ayuda de las otras respuestas 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 );
}
}
Reemplazar
var result= string.search(/searchstring/i);
con
var result= string.search(new RegExp(searchstring, "i"));
Sí, usa .match
, en lugar de .search
. El resultado de la llamada .match
devolverá la cadena real que coincidió, pero aún puede usarse como un valor booleano.
var string = " 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 forma más ordenada y obvia de hacerlo en JavaScript, pero tenga en cuenta que es una expresión regular y, por lo tanto, puede contener metacaracteres de expresiones regulares. Si desea tomar la cadena de otro lugar (por ejemplo, la entrada del usuario), o si desea evitar tener que escapar muchos metacaracteres, entonces es mejor que use indexOf
esta manera:
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'');
}
Si le preocupa el caso de "clase de caracteres no terminados", eliminar todos los caracteres no alfanuméricos sería útil:
searchstring = searchstring.replace(/[^a-zA-Z 0-9]+/g,'''');
Si solo está buscando una cadena en lugar de una expresión regular más complicada, puede usar indexOf()
, pero recuerde en minúsculas las dos cadenas primero porque indexOf()
mayúsculas y minúsculas:
var string=" 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;
Supongamos que queremos encontrar la needle
variable de cadena en el haystack
variable de cadena. Hay tres trampas:
- Las aplicaciones internacionalizadas deben evitar
string.toUpperCase
ystring.toLowerCase
. Utilice una expresión regular que ignora el caso en su lugar. Por ejemplo,var needleRegExp = new RegExp(needle, "i");
seguido deneedleRegExp.test(haystack)
. - En general, es posible que no sepa el valor de la
needle
. Tenga cuidado de que laneedle
no contenga ningún carácter especial de expresión regular. Escape de estos usandoneedle.replace(/[-[/]{}()*+?.,//^$|#/s]/g, "//$&");
. - En otros casos, si desea hacer coincidir con precisión la
needle
y elhaystack
, simplemente ignorando el caso, asegúrese de agregar"^"
al comienzo y"$"
al final de su constructor de expresiones regulares.
Teniendo en cuenta 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);