Подсчет точек с помощью JavaScript возвращает половину - PullRequest
2 голосов
/ 01 декабря 2010

Я написал небольшую функцию для подсчета количества вхождений символа в строку.Он работал просто отлично.

Пока я не попытался подсчитать точки, он продолжает давать мне половину числа, которое он должен.Что я делаю неправильно?Разве я не избегаю точек в правильном порядке?

function count(s1, letter) {
    return (s1.length - s1.replace(new RegExp(letter, "g"), '').length) / letter.length;
}

var loc = 'http://www.domain.com/page' // I'm actually using window.location.href in practice.

var someStringWithDots = 'Yes. I want. to. place a. lot of. dots.';

var somestring = 'abbbcdefg';

count(somestring, 'b');
//returns 3 - correct

count(someStringWithDots, '\\.');
//returns 3 - incorrect

count(loc, '\\.');
//returns 1 - incorrect

Ответы [ 4 ]

9 голосов
/ 01 декабря 2010

Просто используйте .match и все готово:

function count(s1, letter) {
    return ( s1.match( RegExp(letter,'g') ) || [] ).length;
}

count('Yes. I want. to. place a. lot of. dots.','\\.'); //=> 6

[ edit ] Если совпадений не найдено, .length выдаст ошибку.
Добавлен обходной путь для этого (... || [])

2 голосов
/ 01 декабря 2010

Это потому, что letter.length равно 2, и вы делите результат на это.

Попробуйте удалить escape-символы из строки letter, прежде чем считать размер или, что еще лучше, экранировать букву в count().

0 голосов
/ 01 декабря 2010

Попробуйте это.

function count(s1, letter) {
var result = split(s1,letter);
if(result && result.length >0)
    return result.length - 1;
else
 return 0;
}
0 голосов
/ 01 декабря 2010

Вы делитесь на letter.length, но при этом не используется полностью неэкранированная версия вашей строки, поэтому вы фактически погружаетесь на два.

'\\.' un-esacped is \.
`\\.`.length is 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...