2017-10-12 58 views
2

我正在尝试编写一个接收字符串的javascript函数,并计算元音的数量。显示每个元音的数量,以及总数。如果每个元音都在字符串中,它会正常工作,但如果例如没有A或E,它将返回null。Javascript正则表达式比赛即将推出null

有没有办法我可以截取这个并用null替换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>

+0

呀,'match'是一种恼人的方式。我会尝试一种不同的方法:编写一个'函数计数(字符串,字母)'来计算'string'中'letter'的实例数,并用'count(inString,'a')',' count(inString,'e')'等等。你可以保存每一个并将它们加在一起得到元音的总数。 – Ryan

+0

而不是'/ [a]/gi',你可以使用'/ a/gi'。这不会解决你的问题,但它有点清洁...... – Cerbrus

回答

4

可以的情况下,使用|| []为默认的 “返回值” .match返回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>

另外,请注意我的所有单字符删除[]火柴。在正则表达式中,[a]a是等效的。

如果该端是"truthy",则||将返回运算符的左侧。
如果左侧是"falsy"||将始终返回语句的右侧,这是我们的默认值。

如果.match找到任何结果,它将返回一个数组,它是“truthy”。
如果.match未找到任何结果,则返回null,这是“虚假”。

1

问题不是正则表达式中而是在逻辑。

对于给定的inString测试,它没有元音ao。所以正则表达式不会找到任何匹配,这会失败。

你可以尝试这样的事情:

原始代码:

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>

更新的代码

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

match的结果为null时,您可以添加使用条件运算符来输出0而不是length

为了使其更具可读性,您可以事先获取长度,然后在最终的字符串中使用它。

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

这是一种浪费,因为你执行每个正则表达式匹配两次。 –

+0

@TimothyGroote是的,你是对的。刚刚检查下Cerbrus的答案。感谢您指出。 –

相关问题