2013-08-15 6 views
0
function VowelCount(str) { 
    var counter=0; 
    for(i=0; i<str.length; i++) 
    { 
    if (/[AEIOUaeiou]/g.test(str[i])) 
    { 
     counter += 1; 
    } 
    } 
    return counter; 
} 

VowelCount("aaaeeebziiiooouu"); 

Это возвращает «14» на repl.it, но возвращает только «7» на кодербайте.Почему этот подсчет гласных не проходит?

Что я пропустил?

+2

Почему бы просто не использовать 'return str.match (/ [aeiou]/gi) .length;'? – Ian

+3

Вы пропустили тот факт, что кодербайт может быть неисправен. – zzzzBov

+0

Если вы тестируете только одного персонажа, вам не нужно 'g'. –

ответ

1

@ user1544566 обнаружил ответ на этот вопрос и разместил его в комментариях, но он не написал ответ на него. Он сказал:

coderbyte hates the extra g (thanks Mr. Hazmat) Removing the g makes everything work. 

По-видимому, Coderbyte запускает код, который вы отправили неправильно. Кажется, вы нашли ошибку. Я бы хотел сообщить об этом им.

1

Вы могли бы просто использовать match и считать его length:

function vowelCount(str) { 
    return (str.match(/[aeiou]/gi) || []).length; 
} 

Что я пропустил?

Edit: Ваш код работает отлично здесь http://jsbin.com/osesoh/1/edit

+6

Не отвечает на вопрос. – aboveyou00

+0

Шахта была новичком. Теперь я буду использовать вашу версию матча! Благодарю. – dwilbank

+1

Ваше решение сломается, если совпадений нет. Одним из возможных исправлений является 'return (str.match (/ [aeiou]/gi) || []). Length;' –

2

В то время как другие правы, и вместо этого вы должны использовать match. Вы спросили, почему он не работает, и это потому, что вы установили флаг g в свое регулярное выражение, чтобы он отслеживал lastIndex предыдущего матча и начинал смотреть с этого индекса на последующие совпадения.

E.g.

var rx = /a/g; 

rx.test('aa'); //true 

console.log(rx.lastIndex); //1 

rx.test('a'); //false 
+1

Да, но это стандартное поведение - это не объясняет, почему он получает разные результаты. Я думаю, что двигатель, работающий на coderbyte (node?), Каким-то образом кэширует литералы регулярных выражений, в то время как другие создают экземпляр нового объекта регулярного выражения в каждом цикле. – georg

Смежные вопросы