J'essaie d'obtenir une recherche insensible à la casse avec deux chaînes en fonctionnement JavaScript.
Normalement, ce serait comme ceci:
var string="Stackoverflow is the BEST";
var result= string.search(/best/i);
alert(result);
Le /i
drapeau serait insensible à la casse.
Mais je dois rechercher une deuxième chaîne; sans le drapeau, cela fonctionne parfaitement:
var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(searchstring);
alert(result);
Si j'ajoute le /i
drapeau à l'exemple ci-dessus, il rechercherait chaîne de recherche et non ce qui se trouve dans la variable "chaîne de recherche" (l'exemple suivant ne fonctionne pas):
var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(/searchstring/i);
alert(result);
Comment puis-je atteindre cet objectif?
la source
string.match(/best/i);
.match
pour la comparaison booléenne. Il recherche au-delà du premier résultat. Vous devez arrêter après le premier match qui.test
ou.search
faire. Vérifiez les performances ici .toLowerCase
échouera très probablement le test de la Turquie ( moserware.com/2008/02/does-your-code-pass-turkey-test.html ) et des problèmes de conversion de cas similaires. Je ne sais pas commentReGex
ça se passe, mais si je devais deviner, je dirais mieux.var text = "best"; var exp = new RegExp(test, "i");
. C'est la même chose que/best/i
.Remplacer
avec
la source
s = 'a[b'; r = new RegExp(s)
entraîne une erreur de syntaxe (classe de caractèreSi vous recherchez simplement une chaîne plutôt qu'une expression régulière plus compliquée, vous pouvez utiliser
indexOf()
- mais n'oubliez pas de mettre les deux chaînes en minuscules en premier car ellesindexOf()
sont sensibles à la casse:Ou en une seule ligne:
la source
Supposons que nous voulons trouver la variable chaîne
needle
dans la variable chaînehaystack
. Il y a trois pièges:string.toUpperCase
etstring.toLowerCase
. Utilisez une expression régulière qui ignore la casse à la place. Par exemple,var needleRegExp = new RegExp(needle, "i");
suivi deneedleRegExp.test(haystack)
.needle
. Attention,needle
il ne contient aucun caractère spécial d' expression régulière . Échappez-les en utilisantneedle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
.needle
ethaystack
, en ignorant simplement la casse, assurez-vous d'ajouter"^"
au début et"$"
à la fin de votre constructeur d'expressions régulières.Compte tenu des points (1) et (2), un exemple serait:
la source
ES6 +:
includes()
renvoietrue
sisearchString
apparaît à une ou plusieurs positions oufalse
autrement.la source
Si vous êtes préoccupé par le cas de la "classe de caractères non terminée", il serait utile de supprimer tous les caractères non alphanumériques:
la source
J'aime la réponse de @ CHR15TO, contrairement à d'autres réponses que j'ai vues sur d'autres questions similaires, cette réponse montre comment échapper correctement une chaîne de recherche fournie par l'utilisateur (plutôt que de dire que cela serait nécessaire sans montrer comment).
Cependant, c'est encore assez maladroit, et peut-être relativement plus lent. Alors pourquoi ne pas avoir une solution spécifique à ce qui est probablement une exigence commune pour les codeurs? (Et pourquoi ne pas l'inclure dans l'ES6 API BTW?)
Ma réponse [ https://stackoverflow.com/a/38290557/887092] sur une question similaire permet ce qui suit:
la source
Il existe deux façons de comparer la distinction insensible à la casse:
Convertissez les chaînes en majuscules, puis comparez-les à l'aide de l'opérateur strict (
===
). Comment un opérateur strict traite les opérandes lire des trucs à: http://www.thesstech.com/javascript/relational-logical-operatorsCorrespondance de modèle à l'aide de méthodes de chaîne:
Utilisez la méthode de chaîne «recherche» pour une recherche insensible à la casse. Lisez à propos de la recherche et des autres méthodes de chaîne à: http://www.thesstech.com/pattern-matching-using-string-methods
la source
Je le fais souvent et j'utilise un simple prototype de 5 lignes qui accepte les varargs. Il est rapide et fonctionne partout .
la source
Vous pouvez tout mettre en minuscules:
la source
J'ai remarqué que si l'utilisateur entre une chaîne de texte mais quitte l'entrée sans sélectionner aucune des options de saisie semi-automatique, aucune valeur n'est définie dans l'entrée masquée, même si la chaîne coïncide avec celle du tableau. Donc, avec l'aide des autres réponses, j'ai fait ceci:
la source