Array
(
)

Pesquisa de traz para frente

Leonardo Bertolini
|
MVP
    08 fev 2013

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.

Joel Rodrigues
   - 08 fev 2013

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

Robson Robsonalves.net
   - 08 fev 2013

Para isso tem que usar o braço.

Um For inverso.

#Código


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


Leonardo Bertolini
|
MVP
    08 fev 2013

Sim claro.

Suponhamos a seguinte string:

#Código

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.

Leonardo Bertolini
|
MVP
    08 fev 2013



Citação:
Para isso tem que usar o braço.

Um For inverso.

#Código


    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.

Paulo Freire
|
MVP
    08 fev 2013

Se você trabalhar com campo Full-Text

http://www.devmedia.com.br/projetando-e-criando-indices-full-text/7364

Leonardo Bertolini
|
MVP
    08 fev 2013


Citação:
Se você trabalhar com campo Full-Text

http://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.

Robson Robsonalves.net
   - 08 fev 2013

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

#Código


        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.

Joel Rodrigues
   - 08 fev 2013

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?

Joel Rodrigues
   - 08 fev 2013

Exemplificando:

#Código

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

Leonardo Bertolini
|
MVP
    08 fev 2013


Citação:
Exemplificando:

#Código

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

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

#Código

        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.

Robson Robsonalves.net
   - 08 fev 2013

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

Leonardo Bertolini
|
MVP
    08 fev 2013


Citação:
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 !