287 votes

JavaScript : recherche insensible à la casse

J'essaie de faire fonctionner une recherche insensible à la casse avec deux chaînes de caractères en JavaScript.

Normalement, ça devrait être comme ça :

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

Le site /i serait pour l'insensibilité à la casse.

Mais j'ai besoin de 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 Dans l'exemple ci-dessus, la recherche porte sur la chaîne de recherche et non sur 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 y parvenir ?

387voto

Dan Points 20968

Oui, utilisez .match plutôt que .search . Le résultat de la .match renverra la chaîne réelle qui a été mise en correspondance, mais elle peut toujours être utilisée comme une valeur booléenne.

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

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

L'utilisation d'une expression régulière de ce type est probablement le moyen le plus simple et le plus évident de faire cela en JavaScript, mais gardez à l'esprit qu'elle est une expression régulière, et peut donc contenir des métacaractères de regex. Si vous voulez prendre la chaîne de caractères à partir d'un autre endroit (par exemple, l'entrée de l'utilisateur), ou si vous voulez éviter d'avoir à échapper un grand nombre de métacaractères, alors vous êtes probablement mieux d'utiliser indexOf comme ça :

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 votes

Désolé, comment pouvez-vous convertir "best" en variable dans votre premier exemple ? string.match(/best/i);

5 votes

Pourquoi utiliseriez-vous .match pour la comparaison booléenne. Il recherche au-delà du premier résultat. Vous devez vous arrêter après la première correspondance qui .test ou .search faire. Vérifiez les performances ici .

0 votes

toLowerCase échouera très probablement au test du dindon ( moserware.com/2008/02/does-your-code-pass-turkey-test.html ) et des problèmes similaires de conversion de cas. Je ne sais pas comment ReGex le manie, mais si je devais deviner, je dirais mieux.

191voto

Sergey Ilinsky Points 16803

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

remplacer par :

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

8 votes

C'est une façon plutôt désordonnée de contourner le problème, car elle prend des mesures pour se prémunir contre les métacaractères inattendus des regexp.

36 votes

Dan, je doute que ma réponse mérite -1 de votre part. J'ai essayé d'aider ChrisBo en corrigeant son utilisation incorrecte de JavaScript, à savoir : var result= string.search(/searchstring/i) ; en une utilisation correcte, où la variable searchstring était utilisée comme il le souhaitait.

9 votes

Dan a raison (bien qu'il ait probablement voulu dire " pas de mesures") : s = 'a[b'; r = new RegExp(s) entraîne une erreur de syntaxe (classe de caractères non terminés)

41voto

Odilon Redo Points 191

Si vous recherchez simplement une chaîne de caractères plutôt qu'une expression régulière plus complexe, vous pouvez utiliser indexOf() - mais n'oubliez pas de mettre d'abord les deux chaînes en minuscules car indexOf est sensible à la casse :

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);

Ou en une seule ligne :

var result = string.toLowerCase().indexOf(searchstring.toLowerCase())>=0;

2voto

dsomnus Points 576

Si vous êtes préoccupé par le cas de la "classe de caractères non terminés", il serait utile de supprimer tous les caractères non alphanumériques :

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

2voto

kommradHomer Points 1601

Utilisez simplement string.toLowerCase() sur la source et la chaîne de recherche, si vous voulez une recherche regex globale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X