segunda-feira, 13 de junho de 2011

Expressões Regulares em C#

Hoje vamos falar de expressões regulares em C#. O objetivo será:


  • Contar o número de palavras em um arquivo
  • Contar o número de ocorrências de uma determinada palavra

Bom para isso vamos iniciar o Visual Studio e dar início ao trabalho:

Vamos montar a seguinte tela:


Bom vamos programar uma classe, para trabalhar com nosso arquivo. Vamos chamá-la de File.cs.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Text.RegularExpressions;
namespace ContaPalavrasArquivo
{
class File
{
StreamReader arq; //vai ser usado para ler o arquivo
public File(string caminho) //nosso construtor que recebe o caminho do arquivo
{
arq = new StreamReader(caminho,Encoding.Default);
}
public void readFile(TextBox texto) //lê o arquivo e mostra no TextBox
{
string linha;
do
{
linha = arq.ReadLine();
if (linha != null)
texto.Text = texto.Text + linha + System.Environment.NewLine;
} while (linha != null);
}

public int contaPalavras(TextBox text) //Conta palavras
{
int nPalavras = 0;
string linha;
MatchCollection exp; //vai armazenar o número de ocorrências
linha = text.Text;
if (linha != null)
{
exp = Regex.Matches(linha, @"[\S]+"); //expressão regular para espaços em branco
nPalavras = exp.Count;
}
return nPalavras;
}
//vai contar o número de ocorrências do texto. Para isso, vamos passar o texto que //está no textBox, vamos passar a string que desejamos comparar, e uma variável do //tipo boll que irá indicar se desejamos ou não diferenciar maiúsculas de minúsculas
public int contaOcorrencias(TextBox text, string palavra, bool ignoreCase)
{
MatchCollection exp;
if(ignoreCase)
exp = Regex.Matches(text.Text, palavra,RegexOptions.IgnoreCase);
else
exp = Regex.Matches(text.Text, palavra);
return exp.Count;

}
}
}


Vamos programar o nosso menu:

Vale ressaltar que temos duas variáveis que possuem acesso em todo nosso programa, que devem ser declaradas da seguinte forma:

String caminho;
File arquivo;

Vamos ao código:

private void abrirToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog UI = new OpenFileDialog(); //Vamos abrir uma caixa para ir //diretamente ao arquivo
UI.Filter = "txt files (*.txt)|*.txt";
UI.InitialDirectory = "C:";
UI.Title = "Selecione um arquivo";
if (UI.ShowDialog() == System.Windows.Forms.DialogResult.OK)
caminho = UI.FileName;
else
caminho = null;
if (caminho != null)
{
arquivo = new File(caminho); //criamos a instância de nossa classe
arquivo.readFile(textBoxTexto); //lemos o arquivo que será colocado no //textBoxTexto
}
}



Quando utilizarmos nosso menu irá aparecer um dialogbox como este:



Perfeito, agora depois de abrir o arquivo teremos uma tela como a que segue:




Vamos codificar nosso botão “Conta”

private void buttonContaPalavras_Click(object sender, EventArgs e)
{
int contador = arquivo.contaPalavras(textBoxTexto);
textBoxNPalavras.Text = contador.ToString();
}

Vamos codificar o botão “Conta Ocorrencias”.

Primeiramente vamos adicionar outro form, para que quando clicarmos em “Conta Ocorrencias” nos seja mostrado um form para digitar a palavra que estamos procurando.


Esse form, terá duas variáveis públicas que irão nos ajudar a trabalhar, são elas:

public string palavra;
public bool ignoreCase;

Veja o código do form:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ContaPalavrasArquivo
{
public partial class ContaOcorrencias : Form
{
public string palavra;
public bool ignoreCase;
public ContaOcorrencias()
{
InitializeComponent();
}

private void buttonContaOcorrencias_Click(object sender, EventArgs e)
{
palavra = textBoxPalavra.Text;
if (checkBoxDifMaiuscula.Checked == true)
ignoreCase = false;
else
ignoreCase = true;
this.Close();
}
}
}

Agora sim, vamos codificar nosso botão “Conta Ocorrencias”

private void button1_Click(object sender, EventArgs e)
{
ContaOcorrencias formContaOcorrencias = new ContaOcorrencias();
formContaOcorrencias.ShowDialog();
string palavra = formContaOcorrencias.palavra;
int contador = arquivo.contaOcorrencias(textBoxTexto, palavra, formContaOcorrencias.ignoreCase);
textBoxNOcorrencias.Text = contador.ToString();

}
Bom, executando temos os seguintes resultados:






Nenhum comentário:

Postar um comentário