Similar a una pregunta publicada aquí , estoy buscando una solución en Java.
Es decir, ¿cómo encontrar el índice de la enésima aparición de un carácter / cadena de una cadena?
Ejemplo: " / carpeta1 / carpeta2 / carpeta3 / ". En este caso, si solicito la tercera aparición de barra (/), aparece antes de la carpeta3 y espero devolver esta posición de índice. Mi intención real es hacer una subcadena de la enésima aparición de un carácter.
¿Existe algún método conveniente / listo para usar disponible en la API de Java o necesitamos escribir una pequeña lógica por nuestra cuenta para resolver esto?
También,
- Busqué rápidamente si algún método es compatible con este propósito en StringUtils de Apache Commons Lang , pero no encontré ninguno.
- ¿Pueden las expresiones regulares ayudar en este sentido?
Respuestas:
Si su proyecto ya depende de Apache Commons que puede usar
StringUtils.ordinalIndexOf
, de lo contrario, aquí hay una implementación:Esta publicación ha sido reescrita como un artículo aquí .
fuente
lastIndexOf
.Creo que la solución más fácil para encontrar la enésima aparición de una cadena es usar StringUtils.ordinalIndexOf () de Apache Commons.
Ejemplo:
fuente
Ocurren dos opciones simples:
charAt()
repetidamenteindexOf()
repetidamentePor ejemplo:
Es posible que eso no funcione tan bien como usarlo
indexOf
repetidamente, pero posiblemente sea más sencillo hacerlo bien.fuente
Puedes probar algo como esto:
Tenga en cuenta que hice algunas suposiciones en la expresión regular:
Como se solicitó en un comentario, intentaré explicar la expresión regular:
(/[^/]*){2}/([^/]*)
/[^/]*
es un/
seguido de[^/]*
(cualquier número de caracteres que no sea un/
),(/[^/]*)
agrupa la expresión anterior en una sola entidad. Este es el1
primer grupo de la expresión,(/[^/]*){2}
significa que el grupo debe coincidir exactamente con los{2}
tiempos,[^/]*
es de nuevo cualquier número de caracteres que no sean un/
,([^/]*)
agrupa la expresión anterior en una sola entidad. Este es el2
nd grupo de la expresión.De esta manera, solo tiene que obtener la subcadena que coincida con el segundo grupo:
return m.group(2);
Imagen cortesía de Debuggex
fuente
Hice algunos cambios en la respuesta de aioobe y obtuve una enésima versión de lastIndexOf y solucioné algunos problemas de NPE. Ver código a continuación:
fuente
null
como argumento. Este es el comportamiento más común en la biblioteca estándar.Coincide con cualquier cosa seguida de / dos veces, luego otra vez. El tercero es el que quieres
El estado de Matcher se puede usar para decir dónde está el último /
fuente
fuente
Hoy en día existe soporte para StringUtils de Apache Commons Lang ,
Este es el primitivo:
para su problema, puede codificar lo siguiente:
StringUtils.ordinalIndexOf(uri, "/", 3)
También puede encontrar la última enésima aparición de un carácter en una cadena con el método lastOrdinalIndexOf .
fuente
Puede ser que pueda lograr esto a través del método String.split (..) también.
fuente
Otro enfoque:
fuente
Esta respuesta mejora la respuesta de @aioobe. Se solucionaron dos errores en esa respuesta.
1. n = 0 debería devolver -1.
2. La enésima aparición devolvió -1, pero funcionó en la n-1ª aparición.
Prueba esto !
fuente
fuente
fuente
Mi solución:
fuente
El código devuelve la subcadena de posiciones de ocurrencia n, también conocida como ancho de campo. Ejemplo. si la cadena "Stack overflow in low melow" es la cadena para buscar la segunda ocurrencia del token "low", estará de acuerdo conmigo en que la segunda ocurrencia está en la subcadena "18 y 21" . indexOfOccurance ("Stack overflow in low melow", low, 2) devuelve 18 y 21 en una cadena.
fuente
fuente