Pesquisa de traz para frente
08/02/2013
0
Atualmente estou tentando realizar uma pesquisa de traz para frente. Ou seja, a partir de um ponto específico de uma string, eu gostaria de pesquisar o próximo elemento imediatamente anterior a este ponto. Sei que poderia cortar a string e utilizar o lastIndexOf(), mas dada as minhas circunstâncias (ordens superiores...), tenho que pesquisa uma maneira melhor de fazer isso. Cheguei até a verificar uma biblioteca nativa da .net Framework, a EnvDTE, mas parece que esta funciona especificamente para arquivos.
Alguém saberia dar uma boa sugestão sobre isso.
Leonardo Bertolini
Posts
08/02/2013
Robson Alves
Um For inverso.
class Program { static void Main(string[] args) { string Texto = "DevMedia, A Comunidade de todos!"; string pontoDoTexto = ","; LerInverso(Texto, pontoDoTexto); Console.Read(); } private static void LerInverso(string texto, string ponto) { int position = texto.IndexOf(ponto, System.StringComparison.Ordinal); for (int i = position; i >= 0; i--) { Console.WriteLine(texto[i]); } } }
08/02/2013
Leonardo Bertolini
Suponhamos a seguinte string:
var teste = "eu tenho um caderno verde, com listras brancas, uma estampa e com meu nome escrito na capa! além disso, tenho um lápis";
Neste caso, vamos supor que eu procure pelo índice de "escrito na capa", e quero pesquisar a partir deste índice, até "caderno verde". Ou seja, partir de um ponto e pesquisar por uma ocorrência imediatamente anterior.
No fim, "teste" teria o valor "caderno verde, com listras brancas, uma estampa e com meu nome escrito na capa"
Para isso, não posso usar o lastIndexOf, e a especificidade da situação não me permite usar uma RegEx.
08/02/2013
Leonardo Bertolini
Um For inverso.
class Program { static void Main(string[] args) { string Texto = "DevMedia, A Comunidade de todos!"; string pontoDoTexto = ","; LerInverso(Texto, pontoDoTexto); Console.Read(); } private static void LerInverso(string texto, string ponto) { int position = texto.IndexOf(ponto, System.StringComparison.Ordinal); for (int i = position; i >= 0; i--) { Console.WriteLine(texto[i]); } } }
Olá Robson Alves, obrigado pelo exemplo.
Entretanto, a minha intenção não é a de inverter a string. mas sim de inciar uma pesquisa a partir de um ponto, mas não de um ponto em diante, mas sim de um ponto para todo o conteúdo anterior a ele, até uma correspondência que desejo.
08/02/2013
Paulo Freire
https://www.devmedia.com.br/projetando-e-criando-indices-full-text/7364
08/02/2013
Leonardo Bertolini
https://www.devmedia.com.br/projetando-e-criando-indices-full-text/7364
Olá Paulo Freire, obrigado pela sugestão.
No meu caso, o texto não está em um banco de dados, mas está documento que é varrido pelo sistema. Creio que neste caso, a solução acima não atenda. Outro fator, é que eu faço essa operação com diversas palavras diferentes, e em diversas sentenças em diversos documentos.
08/02/2013
Robson Alves
private static void LerInverso(string texto, string ponto) { int position = texto.IndexOf(ponto, StringComparison.CurrentCultureIgnoreCase); Console.WriteLine(texto.Remove(position + ponto.Length)); }
ele vai pegar o ponto no texto que foi passado para a consulta e vai trazer todo o texto atrás, inclusive o pesquisado (seguindo seu exemplo).
veja se é isso que você deseja.
08/02/2013
Joel Rodrigues
E consegue identificar a posição de "escrito na capa". Você sabe também o comprimento de "escrito na capa", então a posição da última letra dessa expressão, na frase original, é a posição dela somada ao seu comprimento.
Então não bastaria copiar o conteúdo que está entre essas posições?
08/02/2013
Joel Rodrigues
var teste = "eu tenho um caderno verde, com listras brancas, uma estampa e com meu nome escrito na capa! além disso, tenho um lápis"; var indice = "escrito na capa"; var ate = "caderno verde"; int posIndice = teste.IndexOf(indice); int posAte = teste.IndexOf(ate); int comprimento = posIndice + indice.Length - posAte; teste = teste.Substring(posAte, comprimento);
08/02/2013
Leonardo Bertolini
var teste = "eu tenho um caderno verde, com listras brancas, uma estampa e com meu nome escrito na capa! além disso, tenho um lápis"; var indice = "escrito na capa"; var ate = "caderno verde"; int posIndice = teste.IndexOf(indice); int posAte = teste.IndexOf(ate); int comprimento = posIndice + indice.Length - posAte; teste = teste.Substring(posAte, comprimento);
Olá Joel Rodrigues, obrigado pela sugestão.
neste caso, isso seria uma espécie de camuflagem do lastIndexOf. Se fosse assim, eu optaria por pegar toda a string até o ponto que quero e, logo em seguida, eu pegaria o último index da ocorrência dentro deste trecho. Mas o que meu chefe quer, é uma função que faça a pesquisa do tipo backward.
Robson Alves
private static void LerInverso(string texto, string ponto) { int position = texto.IndexOf(ponto, StringComparison.CurrentCultureIgnoreCase); Console.WriteLine(texto.Remove(position + ponto.Length)); }
ele vai pegar o ponto no texto que foi passado para a consulta e vai trazer todo o texto atrás, inclusive o pesquisado (seguindo seu exemplo).
veja se é isso que você deseja.
Robson Alves, obrigado novamente.
Não era bem esse o ponto. Pegar este trecho não tem muito problema pra mim. No caso, eu queria era fazer uma pesquisa para traz, do tipo search backward. Todos os tipo de pesquisa, como indexOf ou lastIndexOf, procura da posição x até y (sendo y sempre maior que x, é claro). No meu caso eu queria algum método, nativo, que pesquise de y para x.
Creio que não exista isso, mas queria perguntar para desencarno de consciência.
08/02/2013
Robson Alves
Procurei algo nativo para você:
http://programmers.stackexchange.com/questions/149139/what-is-net-framework-backward-compatibility
http://stackoverflow.com/questions/2355293/how-to-use-a-regex-to-search-backwards-effectively
http://bytes.com/topic/net/answers/502720-q-how-can-you-use-regular-expression-search-backwards
http://stackoverflow.com/questions/2816914/backwards-compatibility-of-net-framework-4
08/02/2013
Leonardo Bertolini
Procurei algo nativo para você:
http://programmers.stackexchange.com/questions/149139/what-is-net-framework-backward-compatibility
http://stackoverflow.com/questions/2355293/how-to-use-a-regex-to-search-backwards-effectively
http://bytes.com/topic/net/answers/502720-q-how-can-you-use-regular-expression-search-backwards
http://stackoverflow.com/questions/2816914/backwards-compatibility-of-net-framework-4
Creio que a regular expression que pesquisa da esquerda para a direita seja o mais próximo do que preciso. boa dica, valeu !
Clique aqui para fazer login e interagir na Comunidade :)