none
Encontrar string com Regex RRS feed

  • Pergunta

  • Fala galera, blz?

    Tenho a seguinte string [banner id=1,rows=2,cols=3 /]

    Preciso encontrar esta string dentro de um texto, mas o id=1,rows=2,cols=3 podem não existir ou até ter mais parâmetros, a única coisa que sempre vai ter é "[banner " no início da string, inclusive com espaço depois de banner, e no final da string "/]".

    Depois de achado isso [banner XXXX /], quero pegar o que tiver em XXXX e separar os dados. Sempre o que estiver dentro de XXXX será separado por vírgula, sempre atributo=valor, atributo=valor.... e assim vai, pode ter um só, dois, dez. 

    Podem, me ajudar?

    Obrigado.

    Fernando.


    terça-feira, 21 de junho de 2016 20:34

Respostas

  • Acrescente, por favor, os métodos abaixo para listar todos os banners:

    static List<string> procuraBanner(string texto)
            {
                List<string> lista = new List<string>();
                string[] delimitadores = { "[banner" };
                string[] matriz = texto.Split(delimitadores, StringSplitOptions.RemoveEmptyEntries);
                for(int i = 0; i < matriz.Length; i++)
                {
                    string banner = String.Empty;
                    if (i == 0)
                    {
                        if (texto.Substring(0, 7) == "[banner")
                        {
                            banner = "[banner " + lapidaBanner(matriz[i]) + " /]";
                        }
                    }
                    else
                    {
                        banner = "[banner " + lapidaBanner(matriz[i]) + " /]";
                    }
                    if (banner.Length > 0)
                    {
                        lista.Add(banner);
                    }
                }
                return lista;
            }
    
            static string lapidaBanner(string texto)
            {
                string[] delimitadores = { "/]" };
                string[] vetor = texto.Split(delimitadores, StringSplitOptions.RemoveEmptyEntries);
                return vetor[0];
            }

    Para chamar:

    string banner = "teste [banner id = 1, rows = 2, cols = 3 /] teste de busca [banner id = 1, rows = 2, cols = 3 /] e qualquer coisa vale [banner id = 1, rows = 2, cols = 3, width=100 /] e outro banner [banner id = 1, rows = 2, cols = 3, width=200, height=400, border=1 /] qualquer coisa";
    List<string> banners = procuraBanner(banner);

    Sem erros:

    Evidência

    Abs


    quarta-feira, 22 de junho de 2016 12:43

Todas as Respostas

  • Segue:

    static void Main(string[] args)
            {
                string banner = "[banner id = 1, rows = 2, cols = 3 /]";
                Dictionary<string, string> dados = Dicionario(banner);
            }
    
            static Dictionary<string, string> Dicionario(string banner)
            {
                string conteudoLimpo = banner.Replace("[banner ", String.Empty).Replace("/]", String.Empty);
                Dictionary<string, string> dados = new Dictionary<string, string>();
                var vetor = conteudoLimpo.Split(',');
                for(int i = 0; i < vetor.Length; i++)
                {
                    string[] item = vetor[i].Split('=');
                    if (dados.Any(x => x.Key == item[0]) == false)
                    {
                        dados.Add(item[0].Trim(), item[1].Trim());
                    }
                }
                return dados;
            }

    Caso o item como "id", "rows", enfim, possam aparecer mais de uma vez, o conceito é o mesmo, mas ao invés de usar um dicionário, você pode criar uma "struct" ou classe mesmo para popular a lista.

    Qualquer dúvida, é só me avisar.

    Abs.

    terça-feira, 21 de junho de 2016 21:21
  • Fala Gilberto, tudo bem? 

    Mas como encontro essa string banner dentro do meu texto? 

    Imagina que essa string [banner id=1,rows=2,cols=3 /] vai estar no meio do meu texto e a única coisa que sei dela é que ela tem [banner e /] os parâmetros internos não sei quais tem.

    No seu exemplo vc passou o tratamento da string depois de encontrada, correto? Mas como faço para encontrá-la?

    Abç. 

    terça-feira, 21 de junho de 2016 22:47
  • Acrescente, por favor, os métodos abaixo para listar todos os banners:

    static List<string> procuraBanner(string texto)
            {
                List<string> lista = new List<string>();
                string[] delimitadores = { "[banner" };
                string[] matriz = texto.Split(delimitadores, StringSplitOptions.RemoveEmptyEntries);
                for(int i = 0; i < matriz.Length; i++)
                {
                    string banner = String.Empty;
                    if (i == 0)
                    {
                        if (texto.Substring(0, 7) == "[banner")
                        {
                            banner = "[banner " + lapidaBanner(matriz[i]) + " /]";
                        }
                    }
                    else
                    {
                        banner = "[banner " + lapidaBanner(matriz[i]) + " /]";
                    }
                    if (banner.Length > 0)
                    {
                        lista.Add(banner);
                    }
                }
                return lista;
            }
    
            static string lapidaBanner(string texto)
            {
                string[] delimitadores = { "/]" };
                string[] vetor = texto.Split(delimitadores, StringSplitOptions.RemoveEmptyEntries);
                return vetor[0];
            }

    Para chamar:

    string banner = "teste [banner id = 1, rows = 2, cols = 3 /] teste de busca [banner id = 1, rows = 2, cols = 3 /] e qualquer coisa vale [banner id = 1, rows = 2, cols = 3, width=100 /] e outro banner [banner id = 1, rows = 2, cols = 3, width=200, height=400, border=1 /] qualquer coisa";
    List<string> banners = procuraBanner(banner);

    Sem erros:

    Evidência

    Abs


    quarta-feira, 22 de junho de 2016 12:43
  • Valeu Gilberto, funcionou direitinho.

    Muito obrigado pela ajuda.

    Abç.

    quarta-feira, 22 de junho de 2016 17:31