2017-10-12 5 views
2

私は文字列を受け取るjavascript関数を記述しようとしており、母音の数を数えています。各母音の数と総計を表示します。すべての母音が文字列内にあれば正常に動作しますが、たとえばAやEがない場合はnullを返します。Javascriptの正規表現のマッチアップnull

これを傍受してnullを0に置き換える方法はありますか?または、これを達成するより効率的な方法がありますか?助けることができる誰にもありがとう!

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'は迷惑なその方法の一種です。 '文字列'に 'letter'のインスタンス数を数える' function count(文字列、文字) 'を書いて' count(inString、 'a') '、' count(inString、 'e') 'など。それらのそれぞれを保存して一緒に追加して、母音の総数を取得することができます。 – Ryan

+0

'/ [a]/gi'の代わりに'/a/gi'を使うことができます。これはあなたの問題を解決することはできませんが、それは少しきれいです... – Cerbrus

答えて

4

あなたはケースに.match戻りnullをデフォルトの "戻り値" として|| []を使用することができます一致します。正規表現では、[a]aは同等です。

||は、その側が"truthy"である場合、オペレータの左側を返します。
左側が"falsy"の場合、||は常にデフォルト値であるステートメントの右側を返します。

.matchが結果を検出した場合、配列は "真実"です。
.matchに結果が見つからない場合は、nullを返します。これは「偽」です。

1

問題は、正規表現ではなく、ロジックではありません。与えられたinStringについては

テストを言って、それが母音aまたはoを持っていません。正規表現は一致するものが見つからないので、これは失敗します。

あなたはこのような何か試すことができます。

オリジナルコード:

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>
を私はすべての単一文字から []を削除気づく、

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>
また

-1

matchの結果がnullの場合、lengthではなく、0を出力するために条件付き演算子を追加できます。

読みやすくするために、長さを事前に取得してから、最終的な文字列で使用できます。

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

これは、すべての正規表現の一致を2回実行しているので、無駄です。 –

+0

@TimothyGrooteはい、そうです。下のCerbrusの答えをチェックしてみてください。指摘してくれてありがとう。 –