¿Por qué el siguiente algoritmo no se detiene para mí? (str es la cadena que estoy buscando, findStr es la cadena que estoy tratando de encontrar)
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);
Respuestas:
La última línea estaba creando un problema.
lastIndex
nunca estaría en -1, por lo que habría un bucle infinito. Esto se puede solucionar moviendo la última línea de código al bloque if.fuente
¿Qué tal usar StringUtils.countMatches de Apache Commons Lang?
Eso da salida:
fuente
StringUtils
no tienecountMatches
métodoSu
lastIndex += findStr.length();
se colocó fuera de los corchetes, causando un bucle infinito (cuando no se encontró ninguna ocurrencia, lastIndex siempre fue asífindStr.length()
).Aquí está la versión fija:
fuente
Una versión más corta ;)
fuente
return haystack.split(Pattern.quote(needle), -1).length - 1;
si, por ejemploneedle=":)"
,-1
, dejará caer las coincidencias finales.¿Realmente tienes que manejar el emparejamiento tú mismo? Especialmente si todo lo que necesita es el número de ocurrencias, las expresiones regulares son más ordenadas:
fuente
String str = "hel+loslkhel+lodjladfjhel+lo"; Pattern p = Pattern.compile("hel+lo");
Pattern.compile("hel\\+lo");
el+
signo tiene un significado especial en una expresión regular y necesita ser escapado.Pattern.quote(str)
es su amigo!Estoy muy sorprendido de que nadie haya mencionado este revestimiento. Es simple, conciso y funciona ligeramente mejor que
str.split(target, -1).length-1
fuente
Aquí está, envuelto en un método agradable y reutilizable:
fuente
al final del ciclo el conteo es 3; Espero eso ayude
fuente
findStr.length() - 1
resultado es 0 y estamos en un ciclo sin fin.Muchas de las respuestas dadas fallan en uno o más de:
Esto es lo que escribí:
Llamada de ejemplo:
Si desea una búsqueda de expresión no regular, solo compile su patrón apropiadamente con la
LITERAL
bandera:fuente
fuente
replace
, noreplaceAll
.Incremente
lastIndex
siempre que busque la próxima ocurrencia.De lo contrario, siempre se encuentra la primera subcadena (en la posición 0).
fuente
Devuelve el índice dentro de esta cadena de la primera aparición del carácter especificado, comenzando la búsqueda en el índice especificado.
Por lo tanto, su
lastindex
valor siempre es 0 y siempre encuentra hola en la cadena.fuente
La respuesta dada como correcta no es buena para contar cosas como los retornos de línea y es demasiado detallada. Las respuestas posteriores son mejores, pero todo se puede lograr simplemente con
No deja caer las coincidencias finales utilizando el ejemplo de la pregunta.
fuente
Puede hacer un número de ocurrencias usando la función de biblioteca incorporada:
fuente
intente agregar
lastIndex+=findStr.length()
al final de su ciclo, de lo contrario terminará en un ciclo sin fin porque una vez que encontró la subcadena, está tratando de encontrarla una y otra vez desde la misma última posición.fuente
Prueba este. Reemplaza todos los partidos con a
-
.Y si no quieres destruir tu
str
puedes crear una nueva cadena con el mismo contenido:Después de ejecutar este bloque, estos serán sus valores:
fuente
Como @Mr_and_Mrs_D sugirió:
fuente
Según las respuestas existentes, me gustaría agregar una versión "más corta" sin el if:
fuente
Aquí está la versión avanzada para contar cuántas veces se produjo el token en una cadena ingresada por el usuario:
fuente
El siguiente método muestra cuántas veces se repite la subcadena en su cadena completa. Espero uso completo para usted: -
fuente
Aquí está la otra solución sin usar regexp / patterns / matchers o incluso sin usar StringUtils.
fuente
Si necesita el índice de cada subcadena dentro de la cadena original, puede hacer algo con indexOf de esta manera:
fuente
}
fuente
Esta solución imprime el número total de ocurrencias de una subcadena dada en toda la cadena, también incluye los casos en los que existen coincidencias superpuestas.
fuente