.NET - Usando Expressões Regulares - I


Hoje vamos rever alguns conceitos sobre expressões regulares usando dois exemplos práticos.

Eu já escrevi diversos artigos sobre o recurso as expressões regulares. Para saber mais leia os artigos:

Neste artigo vou mostrar uma aplicação prática usando expressões regulares.

  1. Encontrando palavras em um bloco de texto/Arquivo - Encontra palavras isoladas em um bloco de texto. A expressão irá encontrar apenas palavras completas cercadas por espaços ou outros delimitadores de palavras, como pontuação ou início ou fim de uma linha.

Para o exemplo deste artigo eu vou criar uma aplicação Console Application, mas fique a vontade para aplicar o código a outros tipos de projetos.

Recursos usados:

Criando a solução no VS 2017

Abra o VS 2017 e no menu File clique em New Project;

Selecione a linguagem C# e o template Console App (.NET Framework) e informe o nome Cshp_Regex1;

Vamos incluir uma classe no projeto criado onde vamos definir o código que vai usar a expressão regular.

No menu Project clique em Add Class e informe o nome PalavraRegex;

A seguir inclua o código abaixo nesta classe:

using System;
using System.IO;
using System.Text.RegularExpressions;
namespace Cshp_Regex1
{
    public class PalavraRegex
    {
        private static Regex _Regex;
        public PalavraRegex(string palavra)
        {
            _Regex = new Regex(@"\b" + palavra + "\\b");
        }
        public void Procurar(string arquivo)
        {
            String linha;
            int numeroLinha = 0;
            using (StreamReader sr = new StreamReader(arquivo))
            {
                while (null != (linha = sr.ReadLine()))
                {
                    numeroLinha++;
                    if (_Regex.IsMatch(linha))
                    {
                        Console.WriteLine("Ocorrência da palavra:  {0}' na linha {1}", linha, numeroLinha);
                    }
                }
            }
        }
    }
}

Este código define uma expressão regular do tipo \bpalavra\b no construtor da classe :

        public PalavraRegex(string palavra)
        {
            _Regex = new Regex(@"\b" + palavra + "\\b");
        }

Uma classe de caractere especial, \b, permite que você procure facilmente por palavras inteiras.

A expressão esta sendo montada assim:

\b -> um limite de palavra (um espaço, início de uma linha ou pontuação). . .
palavra
\b
-> um limite de palavra no final da palavra.

O método Procurar() abre o arquivo informado onde a busca pelas ocorrências da palavra serã realizadas e usa o método IsMatch que Indica se a expressão regular localiza uma correspondência na cadeia de caracteres de entrada.

Você pode consumir esta classe de diversas formas. No exemplo vamos definir no arquivo Program.cs o código abaixo:

using System;
namespace Cshp_Regex1
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("Informe o nome do arquivo. (Para sair tecle -> X )");
                string arquivo = Console.ReadLine();
                if (arquivo == "X")
                {
                    break;
                }
                Console.WriteLine("Informe a palavra a procurar. (Para sair tecle -> X ");
                string palavra = Console.ReadLine();
                if (palavra == "X") 
                {
                    break;
                }
                PalavraRegex r = new PalavraRegex(palavra);
                r.Procurar(arquivo);
            }
        }
    }
}

Optei por criar um programa Console onde o usuário vai informar o local e nome do arquivo no qual deseja pesquisar a palavra e a seguir qual palavra vai pesquisar.

O programa irá exibir as ocorrências indicando o número da linha no arquivo.

No exemplo de execução abaixo foram informados :

1- arquivo : c:\dados\txt\FernandoPessoa2.txt

2- palavra : nada

Nota :  A versão VB .NET para classe PalavraRegex é dada abaixo:

Imports System.IO
Imports System.Text.RegularExpressions
Public Class PalavraRegex
    Private Shared _Regex As Regex
    Sub New(palavra As String)
        _Regex = New Regex("\b" & palavra & "\b")
    End Sub
    Public Sub Procurar(ByVal arquivo As String)
        Dim linha As String
        Dim numeroLinha As Integer = 0
        Dim sr As StreamReader = File.OpenText(arquivo)
        linha = sr.ReadLine

        While Not linha Is Nothing
            numeroLinha = numeroLinha + 1
            If _Regex.IsMatch(linha) Then
                Console.WriteLine("Ocorrências : '{0}' na linha {1}",
                linha,
                numeroLinha)
            End If
            linha = sr.ReadLine
        End While

        sr.Close()
    End Sub
End Class

Pegue o projeto completo aqui : Cshp_Regex1.zip

"Se alguém me serve, siga-me, e onde eu estiver, ali estará também o meu servo. E, se alguém me servir, meu Pai o honrará. "
João 12:26

Referências:


José Carlos Macoratti