Pesquisa de traz para frente

08/02/2013

0

Prezados, bom dia.

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

Leonardo Bertolini

Responder

Posts

08/02/2013

Joel Rodrigues

Olá, amigo.
Você poderia dar um exemplo dessa busca?
Responder

08/02/2013

Robson Alves

Para isso tem que usar o braço.

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]);
            }
        }
    }


Responder

08/02/2013

Leonardo Bertolini

Sim claro.

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.
Responder

08/02/2013

Leonardo Bertolini



Para isso tem que usar o braço.

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.
Responder

08/02/2013

Paulo Freire

Responder

08/02/2013

Leonardo Bertolini




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.
Responder

08/02/2013

Robson Alves

Cara, troque o método lerInverso que eu fiz acima por esse:


        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.
Responder

08/02/2013

Joel Rodrigues

Você consegue facilmente identificar a posição de "caderno verde", certo?
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?
Responder

08/02/2013

Joel Rodrigues

Exemplificando:

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);
Responder

08/02/2013

Leonardo Bertolini

Exemplificando:

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
Cara, troque o método lerInverso que eu fiz acima por esse:


        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.

Responder

08/02/2013

Robson Alves

acho que entendi ao mesmo tempo não.

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
Responder

08/02/2013

Leonardo Bertolini

acho que entendi ao mesmo tempo não.

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 !
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar