Comparaison de deux chaine javascript

Résolu/Fermé
snoopdog94350 - 13 déc. 2009 à 23:23
 lagrangien8 - 7 juin 2011 à 14:21
Bonjour,

voila je vous expose mon probleme je dois comparer deux chaines en java script c'est a dire que l'utilisateur entre une première chaine puis une seconde et lorsqu'il clic sur un bouton un message d'alerte lui dis combien de fois la seconde chaine apparait dans la première chaine j'ai réussi a faire la comparaison entre un caractère et une chaine c'est a dire que l'utilisateur rentre une chaine puis un caractère et ensuite on affiche toujours avec une alerte combien de fois son caractère apparait dans la chaine mais pour comparer une chaine a une autre je n'y arrive pas merci de vos réponses PS: voici mon code pour la comparaison d'un caractère par rapport a une chaine



function Analyse(F)

{

var cpt1,cpt2;


cpt1 = 0;
cpt2 = 0;

while(cpt1<F.chaine1.value.length)
{

if(F.chaine1.value.charAt(cpt1)==F.caract.value)
{
cpt2 = cpt2 + 1;
}
cpt1 = cpt1 + 1;

};
alert('La chaine '+F.chaine1.value+' a une longueur de '+F.chaine1.value.length+' , en majuscule : '+F.chaine1.value.toUpperCase()+'.\nElle contient '+cpt2+' lettre '+F.caract.value+'.');

}
A voir également:

4 réponses

Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
14 déc. 2009 à 09:24
Salut,
argh ! mets des points dans tes phrases stp :P

En JavaScript, on a des fonctions tellement puissantes sur String qu'on finit par oublier l'existence des caractères.
Je vois au moins deux solutions. La première passe par une expression régulière (Regular Expression, abrégé RegExp) : tu transformes la deuxième chaîne en RegExp en ajoutant le drapeau 'g' (pour 'global'), comme ceci :

// on a récupéré au préalable les deux chaînes à comparer, chaine1 et chaine2
var maRegExp = new RegExp(chaine2, 'g');

Puis tu utilises la méthode match() de String sur chaine1, qui va te renvoyer une sorte de tableau, dont on peut récupérer la taille :

var cpt = chaine1.match(maRegExp).length;



Mais si les RegExp te dépassent, on peut utiliser une méthode plus intuitive avec la méthode indexOf. Seul problème, cette méthode n'existe pas sous IE… Je donne le code et j'explique après.

var cpt = 0,
	position = chaine1.indexOf(chaine2);
while (position > -1) {
	cpt++;
	position = chaine1.indexOf(chaine2, position+1);
}

indexOf renvoie la position de la chaîne recherchée, dans la chaîne examinée, en regardant à partir du nombre passé en 2me paramètre. Par exemple :

botteDeFoin.indexOf(aiguille, 3);

on regarde si aiguille apparaît dans botteDeFoin à partir du 3me caractère.

Si indexOf ne trouve rien, elle renvoie -1, c'est pourquoi mon while compare position avec -1.


Je reste dispo pour les questions ;)
3
Merci beaucoup, la methode avec les expression vient de me sauver d'un problème de comparaison entre les chaines de caratère
c'est formidable et bien expliqué en plus
0
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
14 déc. 2009 à 19:36
Alors.
Un conseil, je vois que tu as Firefox, installe Firebug, c'est très utile pour développer en JavaScript !

Je commence par initialiser mes variables.
- cpt contiendra le nombre de fois où chaine2 apparaît dans chaine1,
- position est un nombre égal à l'index du premier caractère de chaine2 trouvé dans chaine1, et c'est comme les tableaux : le 1er caractère est à l'indice 0, le 2me à 1, etc.
Par exemple, essaye :

"azerty".indeoxOf("erty"); // renvoie 2

Une fois que l'initialisation est faite, on a deux cas possibles :
1/ indexOf n'a pas trouvé chaine2 dans chaine1, donc position == -1. À ce moment-là, on n'entre pas dans le while et cpt est égal à 0.

2/ indexOf a trouvé quelque chose, donc on commence le while en faisant cpt++ pour dire qu'on a trouvé au moins une fois. Ensuite on refait une recherche indexOf, mais en commençant après position, pour voir la suite de la chaîne 1. Et ainsi de suite jusqu'à ce que ça s'arrête.
Au final, cpt est égal au nombre de fois qu'indexOf a trouvé quelque chose.

C'est plus clair ? :)
1
snoopdog94350
14 déc. 2009 à 19:41
OUI C'est plus claire en plus g testé sa marche il manquer plus qu'a mettre les variable genre chaine1 en F.chaine1.value F car mon formulaire s'apel F voila tout merci pour tes conseils en tout je c 'est que si j'ai des probleme que tu est la merci pour tout

SNOOPDOG94350
0
snoopdog94350
14 déc. 2009 à 18:48
je vois je vais essayé mais pourquoi cpt++
0
snoopdog94350
14 déc. 2009 à 18:59
bon le indexof et mieux pour moi c'est ce qu'il faut que j'utilise alors ma chaine un s'apel chaine 1 et la deuxieme chaine deux apres comment faire j'arrive pas a comprendre le code malgres tes explications dsl
0