2017-10-12 7 views
2

J'essaie d'écrire une fonction javascript qui reçoit une chaîne, et compte le nombre de voyelles. Affichage du nombre de voyelles, ainsi que du total général. Cela fonctionne bien si chaque voyelle est dans la chaîne, mais si par exemple il n'y a pas de A ou d'E, elle retournera null.Javascript regex match coming null

Y at-il un moyen que je puisse intercepter cela et remplacer les valeurs nulles par 0? Ou y a-t-il un moyen plus efficace d'y parvenir? Merci à tous ceux qui peuvent aider!

function countVowels(inString) { 
 
    return outString = (
 
    "Total vowels: " + inString.match(/[aeiou]/gi).length + 
 
    "\nTotal A's: " + inString.match(/[a]/gi).length + 
 
    "\nTotal E's: " + inString.match(/[e]/gi).length + 
 
    "\nTotal I's: " + inString.match(/[i]/gi).length + 
 
    "\nTotal O's: " + inString.match(/[o]/gi).length + 
 
    "\nTotal U's: " + inString.match(/[u]/gi).length 
 
); 
 
}
<form> 
 
    Enter a string to count its vowels. <br> 
 
    <input type="text" id="inString"><br> 
 
    <button type="button" onclick="console.log(countVowels(inString.value))">Count vowels</button> 
 
</form>

+0

Ouais, 'match' est assez ennuyeux de cette façon. J'essaierais une approche différente: écrire un 'count de fonction (chaîne, lettre)' qui compte le nombre d'instances de 'letter' dans' string', et l'appeler avec 'count (inString, 'a')', ' count (inString, 'e') ', etc. Vous pouvez sauvegarder chacun d'entre eux et les additionner pour obtenir le nombre total de voyelles. – Ryan

+0

Au lieu de '/ [a]/gi', vous pouvez utiliser'/a/gi'. Cela ne résoudra pas votre problème, mais c'est un peu plus propre ... – Cerbrus

Répondre

4

Vous pouvez utiliser || [] comme défaut "valeur de retour" en cas .match retours null:

function countVowels(inString) { 
 
    return outString = (
 
    "Total vowels: " + (inString.match(/[aeiou]/gi) || []).length + 
 
    "\nTotal A's: " + (inString.match(/a/gi) || []).length + 
 
    "\nTotal E's: " + (inString.match(/e/gi) || []).length + 
 
    "\nTotal I's: " + (inString.match(/i/gi) || []).length + 
 
    "\nTotal O's: " + (inString.match(/o/gi) || []).length + 
 
    "\nTotal U's: " + (inString.match(/u/gi) || []).length 
 
); 
 
}
<form> 
 
    Enter a string to count its vowels. <br> 
 
    <input type="text" id="inString"><br> 
 
    <button type="button" onclick="console.log(countVowels(inString.value))">Count vowels</button> 
 
</form>

En outre, notez que j'enlevé le [] de tous un seul caractère allumettes. Dans les expressions régulières, [a] et a sont équivalents.

Le || renverra le côté gauche de l'opérateur si ce côté est "truthy".
Si le côté gauche est "falsy", le || renverra toujours le côté droit de l'instruction, qui est notre valeur par défaut.

Si le .match trouve des résultats, il renvoie un tableau, qui est "véridique". Si le .match ne trouve aucun résultat, il renvoie null, qui est "falsy"

1

problème est pas regex, mais dans la logique.

Pour une donnée inString dire essai, il n'a pas voyelle a ou o. Donc, l'expression rationnelle ne trouvera aucune correspondance et cela échouera.

Vous pouvez essayer quelque chose comme ceci:

Code d'origine:

function countVowels(inString) { 
 
    return outString = (
 
    "Total vowels: " + (inString.match(/[aeiou]/gi) || []).length + 
 
    "\nTotal A's: " + (inString.match(/[a]/gi) || []).length + 
 
    "\nTotal E's: " + (inString.match(/[e]/gi) || []).length + 
 
    "\nTotal I's: " + (inString.match(/[i]/gi) || []).length + 
 
    "\nTotal O's: " + (inString.match(/[o]/gi) || []).length + 
 
    "\nTotal U's: " + (inString.match(/[u]/gi) || []).length 
 
); 
 
}
<form> 
 
    Enter a string to count its vowels. <br> 
 
    <input type="text" id="inString"><br> 
 
    <button type="button" onclick="console.log(countVowels(inString.value))">Count vowels</button> 
 
</form>

code mis à jour

function countVowels(inString) { 
 
    var vowels = "aeiou"; 
 
    var ret = "Total vowels: " + getMatchLength(inString, vowels); 
 
    for(var i = 0; i< vowels.length; i++) 
 
    ret += "\nTotal " + vowels[i].toUpperCase() + "'s: " + getMatchLength(inString, vowels[i]) 
 
    return ret; 
 
} 
 

 
function getMatchLength(str, chars) { 
 
    return (str.match(new RegExp("["+ chars + "]")) || []).length; 
 
}
<form> 
 
    Enter a string to count its vowels. <br> 
 
    <input type="text" id="inString"><br> 
 
    <button type="button" onclick="console.log(countVowels(inString.value))">Count vowels</button> 
 
</form>

-1

Vous pouvez ajouter l'utilisation de l'opérateur conditionnel à la sortie 0 au lieu de length lorsque le résultat de match est null. Pour le rendre plus lisible, vous pouvez obtenir les longueurs à l'avance et ensuite l'utiliser dans votre chaîne finale.

function countVowels(inString) { 
 
    var aCount = inString.match(/[a]/gi) !== null ? inString.match(/[a]/gi).length : 0; 
 
    
 
    var eCount = inString.match(/[e]/gi) !== null ? inString.match(/[a]/gi).length : 0; 
 
    
 
    var iCount = inString.match(/[i]/gi) !== null ? inString.match(/[a]/gi).length : 0; 
 
    
 
    var oCount = inString.match(/[o]/gi) !== null ? inString.match(/[a]/gi).length : 0; 
 
    
 
    var uCount = inString.match(/[u]/gi) !== null ? inString.match(/[a]/gi).length : 0; 
 
    
 
    var vowelsCount = aCount + eCount + iCount + oCount + uCount; 
 
    
 
    var outString = "Total vowels: " + vowelsCount + 
 
    "\nTotal A's: " + aCount + 
 
    "\nTotal E's: " + eCount + 
 
    "\nTotal I's: " + iCount + 
 
    "\nTotal O's: " + oCount + 
 
    "\nTotal U's: " + uCount; 
 
    
 
    return outString; 
 
}
<form> 
 
Enter a string to count its vowels. <br> 
 
<input type="text" id="inString"><br> 
 
<button type="button" onclick="console.log(countVowels(inString.value))">Count vowels</button> 
 
</form>

+2

c'est un peu gaspilleur, puisque vous exécutez chaque match regex deux fois. –

+0

@TimothyGroote oui, vous avez raison. Juste vérifié la réponse de Cerbrus ci-dessous. Merci de m'avoir signalé. –