Почему у меня не останавливается следующий алгоритм? (str - это строка, в которой я ищу, findStr - это строка, которую я пытаюсь найти)
String str = "helloslkhellodjladfjhello";
String findStr = "hello";
int lastIndex = 0;
int count = 0;
while (lastIndex != -1) {
lastIndex = str.indexOf(findStr,lastIndex);
if( lastIndex != -1)
count++;
lastIndex += findStr.length();
}
System.out.println(count);
Ответы:
Последняя строка создавала проблему.
lastIndex
никогда не будет на -1, поэтому будет бесконечный цикл. Это можно исправить, переместив последнюю строку кода в блок if.источник
Как насчет использования StringUtils.countMatches из Apache Commons Lang?
Это выводит:
источник
StringUtils
не имеетcountMatches
метода.Ваш
lastIndex += findStr.length();
был помещен за скобки, что привело к бесконечному циклу (когда вхождения не было найдено, lastIndex всегда былfindStr.length()
).Вот исправленная версия:
источник
Укороченная версия. ;)
источник
return haystack.split(Pattern.quote(needle), -1).length - 1;
если напримерneedle=":)"
,-1
него будут отбрасываться конечные совпадения.Вам действительно нужно самому заниматься подбором? Регулярные выражения выглядят аккуратнее, особенно если все, что вам нужно, - это количество вхождений:
источник
String str = "hel+loslkhel+lodjladfjhel+lo"; Pattern p = Pattern.compile("hel+lo");
Pattern.compile("hel\\+lo");
в+
знак имеет особый смысл в регулярных выражениях и должен быть экранирован.Pattern.quote(str)
ваш друг!Я очень удивлен, что никто не упомянул об этом одном лайнере. Это просто, лаконично и работает немного лучше, чем
str.split(target, -1).length-1
источник
Вот он, завернутый в красивый и многоразовый метод:
источник
в конце цикла счетчик равен 3; Надеюсь, поможет
источник
findStr.length() - 1
возвращается 0, и мы находимся в бесконечном цикле.Многие из приведенных ответов не соответствуют одному или нескольким из:
Вот что я написал:
Пример вызова:
Если вам нужен поиск не по регулярному выражению, просто скомпилируйте свой шаблон соответствующим образом с
LITERAL
флагом:источник
источник
replace
, нетreplaceAll
.Увеличивайте
lastIndex
каждый раз, когда вы ищете следующее вхождение.В противном случае он всегда находит первую подстроку (в позиции 0).
источник
Возвращает индекс в этой строке первого вхождения указанного символа, начиная поиск с указанного индекса.
Таким образом, ваше
lastindex
значение всегда равно 0, и оно всегда находит приветствие в строке.источник
Ответ, данный как правильный, не подходит для подсчета таких вещей, как возврат строки, и слишком подробен. Более поздние ответы лучше, но все может быть достигнуто просто с помощью
Он не отбрасывает конечные совпадения, используя пример в вопросе.
источник
Вы можете количество вхождений, используя встроенную библиотечную функцию:
источник
попробуйте добавить
lastIndex+=findStr.length()
в конец цикла, иначе вы попадете в бесконечный цикл, потому что, найдя подстроку, вы снова и снова пытаетесь найти ее с той же последней позиции.источник
Попробуй это. Он заменяет все совпадения на
-
.И если вы не хотите разрушать свой,
str
вы можете создать новую строку с тем же содержанием:После выполнения этого блока это будут ваши значения:
источник
Как предложил @Mr_and_Mrs_D:
источник
Основываясь на существующих ответах, я хотел бы добавить «более короткую» версию без if:
источник
Вот расширенная версия для подсчета того, сколько раз токен встречался в строке, введенной пользователем:
источник
Этот метод ниже показывает, сколько раз подстрока повторяется на всей строке ur. Надеюсь, вам понадобится: -
источник
вот другое решение без использования регулярных выражений / шаблонов / сопоставителей или даже без использования StringUtils.
источник
Если вам нужен индекс каждой подстроки в исходной строке, вы можете сделать что-нибудь с indexOf следующим образом:
источник
}
источник
Это решение выводит на печать общее количество вхождений данной подстроки по всей строке, а также включает случаи, когда существуют перекрывающиеся совпадения.
источник