Я обновил этот ответ. Мне нравится идея использовать матч лучше, но он медленнее:
console.log(("str1,str2,str3,str4".match(/,/g) || []).length); //logs 3
console.log(("str1,str2,str3,str4".match(new RegExp("str", "g")) || []).length); //logs 4
jsfiddle
Используйте литерал регулярного выражения, если вы заранее знаете, что ищете, если нет, можете использовать RegExp
конструктор и передать g
флаг в качестве аргумента.
match
возвращается null
без результатов, таким образом,|| []
Оригинальный ответ, который я сделал в 2009 году, приведен ниже. Он создает массив без необходимости, но использование разбиения происходит быстрее (по состоянию на сентябрь 2014 года). Я амбивалентен, если бы мне действительно нужна скорость, не было бы сомнений, что я бы использовал сплит, но я бы предпочел использовать матч.
Старый ответ (с 2009 года):
Если вы ищете запятые:
(mainStr.split(",").length - 1) //3
Если вы ищете ул
(mainStr.split("str").length - 1) //4
И в ответе @ Lo, и в моем собственном глупом тесте jsperf разделение идет вперед по скорости, по крайней мере, в Chrome, но опять же создание дополнительного массива просто не кажется нормальным.
Есть как минимум четыре способа. Лучший вариант, который также должен быть самым быстрым - благодаря собственному движку RegEx, - расположен сверху. jsperf.com в настоящее время не работает, в противном случае я бы предоставил вам статистику производительности.
Обновление : пожалуйста, найдите здесь тесты производительностии сами запустите их, чтобы улучшить результаты своей работы. Специфика результатов будет дана позже.
1.
2.
сплит не рекомендуется. Ресурс голоден. Выделяет новые экземпляры Array для каждого совпадения. Не пытайтесь сделать это для> 100 МБ файла через FileReader. На самом деле вы можете легко наблюдать за использованием ресурса EXACT, используя опцию профилирования Chrome .
3.
4.
поиск одного символа
Обновить:
5.
сопоставление и фильтрация элементов, не рекомендуется из-за общего предварительного распределения ресурсов, а не из-за использования Pythonian «генераторов»
Поделиться: Я сделал эту суть , с в настоящее время 8 методов подсчета символов, так что мы можем напрямую объединять и делиться своими идеями - просто для удовольствия, и, возможно, некоторые интересные тесты :)
https://gist.github.com/2757250
источник
||[]
происходит, но этот ответ великолепен! Для любого, кто почесал голову,match()
возвращается,null
если совпадений не найдено, и||[]
возвращает 0, еслиmatch()
возвращаетсяnull
, то естьlength()
будет возвращать 0 вместо выдачи ошибки типа.index = -2
, но большое спасибо @AugustusДобавьте эту функцию в прототип sting:
Применение:
источник
"stringsstringstrings".count("str")
?Быстрый поиск Google получил это (от http://www.codecodex.com/wiki/index.php?title=Count_the_number_of_occurferences_of_a_specific_character_in_a_string#JavaScript )
Используйте это так:
источник
*
char (SyntaxError: nothing to repeat
)Просто используйте разделение, чтобы узнать количество вхождений символа в строку.
mainStr.split(',').length
// дает 4, которое является числом строк после разделения, используя запятую разделителяmainStr.split(',').length - 1
// дает 3, которое является числом запятойисточник
Вот аналогичное решение, но оно использует
Array.prototype.reduce
Как уже упоминалось,
String.prototype.split
работает гораздо быстрее, чемString.prototype.replace
.источник
Я обнаружил, что лучший подход для поиска символа в очень большой строке (например, длиной 1 000 000 символов) - это использовать
replace()
метод.Вы можете увидеть еще один набор JSPerf для тестирования этого метода наряду с другими методами поиска символа в строке.
источник
Вы также можете отдохнуть свою строку и работать с ней как массив элементов, используя
Или
источник
Я внес небольшое улучшение в принятый ответ, он позволяет проверять с учетом регистра / без учета регистра и является методом, прикрепленным к строковому объекту:
lit
является строкой для поиска (например, «ex»), а cis нечувствителен к регистру, по умолчанию имеет значение false, это позволит выбрать совпадения без учета регистра.Для поиска в строке
'I love StackOverflow.com'
буквы нижнего регистра'o'
вы должны использовать:amount_of_os
будет равно2
.Если бы мы снова искали ту же строку, используя сопоставление без учета регистра, вы бы использовали:
Это время
amount_of_os
будет равно3
, так как заглавнаяO
строка из строки включается в поиск.источник
хорошо, другой с регулярным выражением - вероятно, не быстрый, но короткий и лучше читаемый, чем другие, в моем случае просто
'_'
для подсчетапросто удалите все, что не похоже на ваш символ, но это не выглядит хорошо со строкой в качестве ввода
источник
Производительность Split против RegExp
источник
Самый простой способ, который я узнал ...
Пример-
источник
Я работал над небольшим проектом, который требовал счетчика подстрок. Поиск неправильных фраз не дал мне никаких результатов, однако после написания собственной реализации я наткнулся на этот вопрос. Во всяком случае, вот мой путь, он, вероятно, медленнее, чем большинство здесь, но может быть полезным для кого-то:
http://jsfiddle.net/5ZzHt/1/
Пожалуйста, дайте мне знать, если вы обнаружите, что эта реализация не работает или не соответствует некоторым стандартам! :)
ОБНОВЛЕНИЕ Вы можете заменить:
С:
Интересно прочитать обсуждение выше: http://www.erichynds.com/blog/javascript-length-property-is-a-stored-value
источник
Если вы используете lodash, метод _.countBy сделает это:
Этот метод также работает с массивом:
источник
Вот мое решение. Много решений уже выложено до меня. Но я люблю делиться своим мнением здесь.
Здесь вы найдете мой REPL
источник
Самый быстрый метод, кажется, через оператор индекса:
Или как функция-прототип:
источник
Далее используется регулярное выражение для проверки длины. testex гарантирует, что у вас нет 16 или более последовательных символов без запятой. Если он проходит тест, он продолжает разделять строку. подсчет запятых так же прост, как подсчет токенов минус один.
источник
источник
Как насчет string.split (требуемый характер) .length-1
Пример:
var str = "привет как жизнь"; var len = str.split ("h"). length-1; даст счет 2 для символа "h" в приведенной выше строке;
источник
Я использую Node.js v.6.0.0, и самый быстрый из них - с индексом (третий метод в ответе Ло Сауэра).
Второе:
источник
Вот один почти такой же быстрый, как методы split и replace, которые чуть-чуть быстрее, чем метод регулярных выражений (в chrome).
источник
Я только что сделал очень быстрый и грязный тест на repl.it с использованием Node v7.4. Для одного символа стандарт для цикла самый быстрый:
Некоторый код :
Результаты нескольких заездов :
источник
И есть:
Работает с целыми числами тоже!
источник
Мое решение:
источник
String.prototype.match
возвратnull
без совпадений. Это означает отсутствие ссылки на объект сlength
атрибутом. Другими словами:String.prototype.match.call('willnotwork', /yesitwill/) === null
Пятый метод в ответе Лео Зауэрса не выполняется, если символ находится в начале строки. например
даст 2 вместо 3, потому что функция фильтра Boolean дает false для 0.
Другая возможная функция фильтра:
источник
Я знаю, что это может быть старый вопрос, но у меня есть простое решение для начинающих в JavaScript.
Как новичок, я мог понять только некоторые из решений этого вопроса, поэтому я использовал два вложенных цикла FOR, чтобы проверить каждый символ на предмет всех остальных символов в строке, увеличивая счетчик. переменную для каждого найденного символа, который равен этому символу.
Я создал новый пустой объект, в котором каждый ключ свойства является символом, а значение - сколько раз каждый символ появлялся в строке (количество).
Пример функции: -
источник
Я полагаю, что вы найдете нижеприведенное решение очень коротким, очень быстрым, способным работать с очень длинными строками, способным поддерживать поиск по нескольким символам, защищенным от ошибок и способным обрабатывать поиск пустых строк.
Пример использования:
Приведенный выше код исправляет основную ошибку производительности в Jakub Wawszczyk, которая заключается в том, что код продолжает искать совпадения даже после того, как indexOf говорит, что его нет, и его версия не работает, потому что он забыл дать входные параметры функции.
источник
В javascript вы можете использовать приведенный выше код, чтобы получить вхождение символа в строку.
источник
Мое решение с помощью ramda js:
Ссылка на REPL.
источник
Функция принимает строку str в качестве параметра и подсчитывает вхождение каждого уникального символа в строку. Результат приходит в паре ключ-значение для каждого символа.
источник