1

我使用这段代码来搜索和计算字符串中的元音,

a = "run forest, run";
a = a.split(" ");
var syl = 0;
for (var i = 0; i < a.length - 1; i++) {
    for (var i2 = 0; i2 < a[i].length - 1; i2++) {
        if ('aouie'.search(a[i][i2]) > -1) {
            syl++;
        }
    }
}

alert(syl + " vowels")

显然它应该提醒 4 个元音,但它返回 3。出了什么问题以及如何简化它?

4

5 回答 5

5

尝试这个:

var syl = ("|"+a+"|").split(/[aeiou]/i).length-1;

|确保没有边缘情况,例如在字符串的开头或结尾处有元音。

于 2013-02-16T17:19:00.073 回答
4

关于您的代码,您的 if 条件不需要 i2

if('aouie'.search(a[i]) > -1){ 

我想知道,为什么所有使用数组和嵌套循环,下面regex可以做得更好,

var str = "run forest, run";
var matches = str.match(/[aeiou]/gi);
    var count = matches ? matches.length : 0;
    alert(count + " vowel(s)");

演示

于 2013-02-16T17:25:11.667 回答
2

尝试:

a = "run forest, run";

var syl = 0;

for(var i=0; i<a.length; i++) {
        if('aouie'.search(a[i]) > -1){ 
            syl++;
        }
}

alert(syl+" vowels")

首先,拆分是无用的,因为您已经可以循环遍历每个字符。

第二:您需要使用i<a.length,这也将获取字符串中的最后一个字符。

于 2013-02-16T17:18:44.140 回答
1

最简单的方法是

s.match(/[aeiou]/gi).length
于 2014-12-10T10:40:14.307 回答
0

您可以使用 .match 将字符串与正则表达式进行比较。g 是全局的,它将贯穿整个字符串。i 使字符串以大写和小写形式可读。

function getVowels(str) {
      var m = str.match(/[aeiou]/gi);
      return m === null ? 0 : m.length;
    }
于 2015-05-18T08:50:55.600 回答