Javascript 正则表达式匹配即将出现空



我正在尝试编写一个接收字符串并计算元音数量的javascript函数。显示每个元音的计数以及总计。如果每个元音都在字符串中,它就可以正常工作,但是如果例如没有 A 或 E,它将返回 null。

有没有办法拦截它并用 0 替换 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>

您可以使用|| []作为默认的"返回值",以防.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 是等效的。

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

如果.match找到任何结果,它将返回一个数组,该数组为"真实"。
如果.match没有找到任何结果,则返回 null ,这是 "falsy"。

问题不在于正则表达式,而在于逻辑。

对于给定的inString say测试,它没有元音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>

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>

相关内容

  • 没有找到相关文章

最新更新