none
Regex - Expressão Regular RRS feed

  • Pergunta

  • Bom dia Pessoal

    tenho um trabalho da faculdade onde preciso montar um expressao regex que faça a seguinte regra

    a - Encontrar as ocorrências de expressões
    relacionais

    – são aquelas que possuem um identificador
    seguido de algum operador relacional (=;
    <>; >; >=; <; <=) seguido de outro
    identificador ou valor numérico (inteiro ou
    real).

    b) Encontrar as ocorrências de estruturas Se conforme o documento disponibilizado

     

    já fiz inumeras regras e num cheguei nem perto algem ai poderia auxiliar?

    quinta-feira, 13 de maio de 2010 12:07

Respostas

  • Em um post anterior eu te dei a resposta:

    REGRA01.Match(LINHA).Value

    O método IsMatch() vai te trazer um resultado booleando informado se a linha casou ou não com a expressão. O método Match() da classe Regex vai te trazer exatamente o trecho do texto que casou. 

     

    • Sugerido como Resposta Levi DomingosModerator sexta-feira, 14 de maio de 2010 21:45
    • Marcado como Resposta Guike domingo, 16 de maio de 2010 20:51
    sexta-feira, 14 de maio de 2010 17:47

Todas as Respostas

  • Sugiro que você poste as regras que você já tentou para que o pessoal possa te direcionar pelo caminho certo. Seria bem interessante colocar alguns exemplos de expressões que devem casar/falhar com a regra para testes.
    quinta-feira, 13 de maio de 2010 12:31
  • como comecei a aprender agora, dei uma olhada na tabela de metacaracteres eu tente a seguintes regra

     

    Regex REGRA01 = new Regex (@"(\+|\-)[0-9][<>=](\+|\-)|[0-9]");

     

    imagino eu que seja para pegar a seguinte expressao

     

    -8<5 algo do tipo assim!

    quinta-feira, 13 de maio de 2010 12:56
  • Vamos por partes. 

    1. O identificador seria como o nome de uma variável. Por exemplo, deve iniciar com uma letra e pode ser seguido de mais letras e/ou números:

    [a-z][0-9a-z]*

     

    2. O operador relacional:

    (=|<|>|>=|<=)

     

    3. Seguido de outro operador OU número.

    [0-9a-z]+

     

    Juntando tudo:

    [a-z][0-9a-z]*\s?(=|<|>|>=|<=)\s?[0-9a-z]+

    O "\s?" indicando que pode existir um espaço em branco ao redor do operador.

     

    Essa expressão CASA com:

     

    a = 1

    b >0

    c5h< 20

    d>=55

    f1 <= g

     

    Essa expressão NÃO CASA com:

     

    1 < 1

    450>=20

     

    Repare que eu não considerei números negativos (antecedidos de "-"). Essa fica com você.

    Recomendo que você leia o guia do Aurélio. É um ótimo material sobre expressões regulares. 

     

    quinta-feira, 13 de maio de 2010 13:27
  • humm entendi creio eu que seria assim mesmo

     

    eu ainda num consegui aplicar por que num sei se to passando a regra certo quando ele entra no while ele tah saindo fora como se a condição fosse falsa

     

    tipo

    Regex REGRA01 = new Regex(@"[a-z][0-9a-z]*\s?(=|<|>|>=|<=)\s?[0-9a-z]+");

     

    while (!LEITOR.EndofStream)

    {

    LINHA = LEITOR.ReadLine();

    if (REGRA01.IsMatch(LINHA))

     

    essa passagem da regra aplicando no texto está correto?

    quinta-feira, 13 de maio de 2010 16:07
  • Sua expressão regular está certa. O problema está no "LEITOR". Se você está lendo as informações de um arquivo certifique-se que está abrindo corretamente esse arquivo e que ele tem algum conteúdo.
    quinta-feira, 13 de maio de 2010 16:53
  • ele abre o arquivo txt e exibe o conteudo desse arquivo esse arquivo é um teste que eu digitei a seguinte frase

    var a=8;

     

    eu gostaria de pegar só o "a=8", estou usando a expressão regular normalmente e gostaria que casa-se com esta e colocasse num listbox!!

     

    ele abre o arquivo normamelte exibe seu conteudo sem erro!

    quinta-feira, 13 de maio de 2010 17:28
  • Seria algo assim:

     

          string linhaTeste = "var a=8;";
          Regex REGRA01 = new Regex(@"[a-z][0-9a-z]*\s?(=|<|>|>=|<=)\s?[0-9a-z]+");
    
          if (REGRA01.IsMatch(linhaTeste))
          {
            listBox1.Items.Add(REGRA01.Match(linhaTeste).Value);
          }

    quinta-feira, 13 de maio de 2010 17:39
  • é certo dizer isso?

     

    StreamReader LEITOR = new StreamReader(txtConteudo.Text, Encoding.GetEncoding("ISO-8859-1"));
    
    string LINHA = string.empty;
    
    Regex REGRA01 = new Regex(@"[a-z][0-9a-z]*\s?(=|<|>|>=|<=)\s?[0-9a-z]+");
    
    try
    {
     lstResultado01.items.Clear();
    
     while(!LEITOR.EndOfStream)
     {
       LINHA = LEITOR.ReadLine();
      
         if (REGRA01.IsMatch(LINHA))
            {
              lstResultado.Items.Add(LINHA);
            }
      }
    
    }

    • Marcado como Resposta Guike quinta-feira, 13 de maio de 2010 20:16
    • Não Marcado como Resposta Guike quinta-feira, 13 de maio de 2010 20:16
    quinta-feira, 13 de maio de 2010 18:38
  • Alguns erros no código como:

     

    string.empty; // O correto é string.Empty, o c# é case sensitive
    
    lstResultado01.items.Clear(); // Items, mesmo caso do anterior
    
    lstResultado01 e lstResultado // São realmente 2 controles diferentes?
    
    try{} //Onde está o catch ou finally?

     

    Corrigindo esses erros você está fazendo:

    1. Abrindo um arquivo de texto cujo caminho está em txtConteudo.Text;

    2. Limpando um Listbox;

    3. Cada linha que casa com sua expressão regular é adicionada ao ListBox;

     

    É esse o comportamento esperado?

     

     

     

    • Editado Luciano Campos sexta-feira, 14 de maio de 2010 14:16 Complemento na resposta.
    sexta-feira, 14 de maio de 2010 14:13
  • Então na verdade eu queria pegar tipo dentro de um texto só a parte que casa e não a linha inteira exemplo

    como se eu fizesse um codigo inventado dentro de um arquivo e chamasse esse arquivo e aplicasse a regra, ficaria assimm:

     

    conteudo do arquivo:

     

    função inicio()

      var a

      var b

     

      a = 10

      b = 11

     

    fim

     

     

    gostaria de adicionar a minha listbox só "a = 10" e "b = 11"

    sexta-feira, 14 de maio de 2010 16:10
  • Em um post anterior eu te dei a resposta:

    REGRA01.Match(LINHA).Value

    O método IsMatch() vai te trazer um resultado booleando informado se a linha casou ou não com a expressão. O método Match() da classe Regex vai te trazer exatamente o trecho do texto que casou. 

     

    • Sugerido como Resposta Levi DomingosModerator sexta-feira, 14 de maio de 2010 21:45
    • Marcado como Resposta Guike domingo, 16 de maio de 2010 20:51
    sexta-feira, 14 de maio de 2010 17:47
  • consegui aplicar a regra muito obrigado Luciano

    abraços!

    • Marcado como Resposta Guike domingo, 16 de maio de 2010 20:51
    • Não Marcado como Resposta Guike domingo, 16 de maio de 2010 20:51
    sexta-feira, 14 de maio de 2010 18:47
  • consegui aplicar a regra muito obrigado Luciano

    abraços!

    marca como respondida assim fechamos este thread
    Just Be Humble Malange!
    sexta-feira, 14 de maio de 2010 21:46
    Moderador