Semelhante a uma pergunta postada aqui , estou procurando uma solução em Java.
Ou seja, como encontrar o índice da enésima ocorrência de um caractere / string a partir de uma string?
Exemplo: " / pasta1 / pasta2 / pasta3 / ". Nesse caso, se eu solicitar a 3ª ocorrência da barra (/), ela aparecerá antes da pasta3 e espero retornar esta posição do índice. Minha intenção real é transformá-la em substring a partir da enésima ocorrência de um caractere.
Existe algum método conveniente / pronto para uso disponível na API Java ou precisamos escrever uma pequena lógica por conta própria para resolver isso?
Além disso,
- Eu pesquisei rapidamente se algum método é compatível com esse propósito no StringUtils do Apache Commons Lang , mas não encontrei nenhum.
- As expressões regulares podem ajudar nesse sentido?
Respostas:
Se o seu projeto já depende do Apache Commons, você pode usar
StringUtils.ordinalIndexOf
, caso contrário, aqui está uma implementação:Esta postagem foi reescrita como um artigo aqui .
fonte
lastIndexOf
.Acredito que a solução mais fácil para encontrar a enésima ocorrência de uma String é usar StringUtils.ordinalIndexOf () do Apache Commons.
Exemplo:
fonte
Duas opções simples ocorrem:
charAt()
repetidamenteindexOf()
repetidamentePor exemplo:
Isso pode não funcionar tão bem quanto usar
indexOf
repetidamente, mas é possivelmente mais simples de acertar.fonte
Você pode tentar algo assim:
Observe que fiz algumas suposições na regex:
Conforme solicitado em um comentário, tentarei explicar a regex:
(/[^/]*){2}/([^/]*)
/[^/]*
é um/
seguido por[^/]*
(qualquer número de caracteres que não sejam a/
),(/[^/]*)
agrupa a expressão anterior em uma única entidade. Este é o primeiro1
grupo da expressão,(/[^/]*){2}
significa que o grupo deve corresponder exatamente{2}
vezes,[^/]*
é novamente qualquer número de caracteres que não sejam um/
,([^/]*)
agrupa a expressão anterior em uma única entidade. Este é o segundo2
grupo da expressão.Dessa forma, você só precisa obter a substring que corresponda ao segundo grupo:
return m.group(2);
Imagem cortesia de Debuggex
fonte
Fiz algumas alterações na resposta do aioobe e obtive uma enésima versão lastIndexOf e consertei alguns problemas de NPE. Veja o código abaixo:
fonte
null
como argumento. Este é o comportamento mais comum na biblioteca padrão.Combine qualquer coisa seguida por / duas vezes e, em seguida, novamente. O terceiro é o que você quer
O estado do Matcher pode ser usado para dizer onde o último / está
fonte
fonte
Hoje em dia EXISTE suporte para StringUtils do Apache Commons Lang ,
Este é o primitivo:
para o seu problema, você pode codificar o seguinte:
StringUtils.ordinalIndexOf(uri, "/", 3)
Você também pode encontrar a última enésima ocorrência de um caractere em uma string com o método lastOrdinalIndexOf .
fonte
Pode ser que você possa fazer isso por meio do método String.split (..) também.
fonte
Outra abordagem:
fonte
Esta resposta melhora a resposta de @aioobe. Dois bugs nessa resposta foram corrigidos.
1. n = 0 deve retornar -1.
2. A enésima ocorrência retornou -1, mas funcionou na enésima ocorrência.
Experimente isso!
fonte
fonte
fonte
Minha solução:
fonte
O código retorna a enésima ocorrência de posições de substring, também conhecida como largura do campo. Exemplo. se a string "Stack overflow in low melow" for a string para pesquisar a 2ª ocorrência do token "baixo", você concordará comigo que a 2ª ocorrência está na subtring "18 e 21" . indexOfOccurance ("Stack overflow in low melow", low, 2) retorna 18 e 21 em uma string.
fonte
fonte