A menos que esteja faltando um método óbvio integrado, qual é a maneira mais rápida de obter o n º ocorrência de uma cadeia dentro de uma string?
Percebo que poderia fazer um loop no método IndexOf atualizando seu índice inicial em cada iteração do loop. Mas fazer assim parece um desperdício para mim.
Respostas:
Isso é basicamente o que você precisa fazer - ou pelo menos, é a solução mais fácil. Tudo o que você estaria "desperdiçando" é o custo de n invocações de método - na verdade, você não verificará nenhum caso duas vezes, se pensar sobre isso. (IndexOf retornará assim que encontrar a correspondência, e você continuará de onde parou.)
fonte
StringUtils.ordinalIndexOf()
. C # com todo o Linq e outros recursos maravilhosos, simplesmente não tem um suporte integrado para isso. E sim, é muito importante ter seu suporte se você estiver lidando com analisadores e tokenizadores.string
:)Você realmente poderia usar a expressão regular
/((s).*?){n}/
para pesquisar a n-ésima ocorrência de substrings
.Em C #, pode ser assim:
Nota: Eu adicionei
Regex.Escape
a solução original para permitir a pesquisa de caracteres que têm um significado especial para o mecanismo regex.fonte
value
? No meu caso, eu estava procurando um ponto msdn.microsoft.com/en-us/library/…Aqui está a implementação recursiva (da ideia acima ) como um método de extensão, imitando o formato do (s) método (s) de estrutura:
Além disso, aqui estão alguns testes de unidade (MBUnit) que podem ajudá-lo (para provar que está correto):
fonte
ou em C # com métodos de extensão
fonte
index
inicialmente como -1."BOB".IndexOf("B")
retorna 0, então esta função deve serIndexOfOccurence("BOB", "B", 1)
IndexOfOccurence
não verificar ses
énull
. E String.IndexOf (String, Int32) irá lançarArgumentNullException
sematch
fornull
.Talvez também seja bom trabalhar com o
String.Split()
Método e verificar se a ocorrência solicitada está no array, se você não precisa do índice, mas do valor do índicefonte
Após alguns benchmarking, esta parece ser a solução mais simples e eficiente
fonte
System.ValueTuple ftw:
var index = line.Select((x, i) => (x, i)).Where(x => x.Item1 == '"').ElementAt(5).Item2;
escrever uma função que é lição de casa
fonte
A resposta de Tod pode ser um pouco simplificada.
Resultado
fonte
Ou algo assim com o loop do while
fonte
Isso pode resolver:
fonte