Vamos a programar #65 - Expresiones regulares en C#

Hola de nuevo a todos el dia de hoy vamos a continuar con más sobre expresiones regulares y cómo es que podemos implementarlas en C#.

En post recientes hemos visto ejemplos de expresiones regulares, para poder ejecutarlos usamos Notepad++, pero ¿que pasa si no tienes instalado este programa o simplemente no quieres hacerlo porque ya tienes otro bloc de notas? Para eso vamos a crear un pequeño programa en C# que servira para probar las expresiones regulares.

Para empezar, veamos el siguiente código:


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

namespace WordsFinder
{
	public partial class FrmMain : Form
	{
		public FrmMain()
		{
			InitializeComponent();
		}
		
		private Color FontColor = (Color)Properties.Settings.Default["ColorFont"];
		private Color BackGroundColor = (Color)Properties.Settings.Default["ColorBack"];
		
		private void ResetRTB()
		{
			RTBText.SelectAll();
			RTBText.SelectionBackColor = Color.FromName("white");
			RTBText.SelectionColor = Color.FromName("black");
		}

		private void Buscar()
		{
			if(!LBHistory.Items.Contains(TXTRegEx.Text))
				LBHistory.Items.Add(TXTRegEx.Text);
			ResetRTB();
			MatchCollection wordColl = Regex.Matches(RTBText.Text, TXTRegEx.Text);
			foreach (Match m in wordColl)
			{
				RTBText.SelectionStart = m.Index;
				RTBText.SelectionLength = m.Length;
				RTBText.SelectionBackColor  = BackGroundColor;
				RTBText.SelectionColor = FontColor;
			}
			RTBText.ScrollToCaret();
			TSSlblFound.Text = "Se encontraron: " + wordColl.Count.ToString();
		}

		private void BtnSearch_Click(object sender, EventArgs e)
		{
			Buscar();
		}

		private void BtnReset_Click(object sender, EventArgs e)
		{
			ResetRTB();
		}

		private void TSBtnOpen_Click(object sender, EventArgs e)
		{
			OpenFileDialog OpDiag = new OpenFileDialog();
			OpDiag.Filter = "Archivos de texto|*.txt|Todos los archivos|*.*";
			OpDiag.Multiselect = false;
			DialogResult DiagRes = OpDiag.ShowDialog();
			if (DiagRes == DialogResult.OK)
			{
				RTBText.Clear();
				this.Text = "Word Finder - " + OpDiag.FileName;
				StreamReader SR = new StreamReader(OpDiag.FileName, Encoding.UTF8);
				RTBText.AppendText(SR.ReadToEnd());
			}
		}

		private void TSBtnColor_Click(object sender, EventArgs e)
		{
			Form FrmOptions = new FrmAjustes();
			DialogResult DiagRes = FrmOptions.ShowDialog();
			if (DiagRes == DialogResult.OK)
			{
				FontColor = (Color)Properties.Settings.Default["ColorFont"];
				BackGroundColor = (Color)Properties.Settings.Default["ColorBack"];
			}
		}

		private void LBHistory_SelectedIndexChanged(object sender, EventArgs e)
		{
			TXTRegEx.Text = LBHistory.Items[LBHistory.SelectedIndex].ToString();
		}

		private void TXTRegEx_KeyPress(object sender, KeyPressEventArgs e)
		{
			if (e.KeyChar == 13)
				Buscar();
		}
	}
}

Para poder usar las expresiones regulares, debemos de importar el espacio de nombres "System.Text.RegularExpressions". Luego, todo el trabajo se hace en la función "Buscar()". En esta funcion, lo primero que hacemos es revisar si la expresión que queremos buscar ya está guardada en el "ListBox" "LBHistory", si no esta la agrega; en caso contrario, no lo hace. Luego creamos una variable del tipo "MatchCollection" llamada "wordColl" cuyo valor será el resultado de la función  "Regex.Matches()", a su vez esta función recibe dos parámetros; el primero: Es un valor del tipo "string" que será la cadena de texto en la que se buscarán los patrones de expresión regular, para este parámetro simplemente asignamos el contenido de "RTBText" que es un cuadro de texto de formato enriquecido (RichTextBox). El segundo parámetro también es una cadena de texto, este debe de ser el patrón de expresión regular que se quiere evaluar, en este caso el valor "Text" del control "TXTRegEx" (TextBox).

Una vez que se ejecuta la función, todos los resultados se "guardarán" en la variable "wordColl". Para poder saber cuales fueron los resultados, debemos de recorrer los valores, para eso, podemos usar un iteardor "foreach" recorriendo todos los valores. Cada uno de estos será un valor del tipo "Match" y  cómo lo sugiere su nombre, es el singular de "MatchCollection". Cada valor del tipo "Match" posee sub-funciones, en este caso solo usamos "Match.Index()" que sirve para indicar en que posición se encontró la coincidencia dentro de la cadena de texto que se pasó por parámetro a Regex.Matches()". este valor se usa para iniciar la selección en el control "RTBText" y luego usamos "Match.Length()"; que indica cual es la longitud de la coincidencia; para poder resaltar la palabra que se encontró en el texto del control "RTBText".



Con la anterior, se marcará cada coincidencia, pero ademas la aplicación dispone de un par de funciones adicionales, una es para abrir un archivo de texto externo y otra para poder configurar cómo es que queremos que el texto se resalte. Para eso hacemos uso de un segundo formulario cuyo código es el que sigue:

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 WordsFinder
{
	public partial class FrmAjustes : Form
	{
		public FrmAjustes()
		{
			InitializeComponent();
		}

		private void BtnFontColor_Click(object sender, EventArgs e)
		{
			ColorDialog ColorDiag = new ColorDialog();
			DialogResult DiagRes = ColorDiag.ShowDialog();
			if (DiagRes == DialogResult.OK)
			{
				Properties.Settings.Default["ColorFont"] = ColorDiag.Color;
				lblMuestraBig.ForeColor = ColorDiag.Color;
				Properties.Settings.Default.Save();
			}
		}

		private void BtnAccept_Click(object sender, EventArgs e)
		{
			this.DialogResult = DialogResult.OK;
			this.Close();
		}

		private void BtnBackColor_Click(object sender, EventArgs e)
		{
			ColorDialog ColorDiag = new ColorDialog();
			DialogResult DiagRes = ColorDiag.ShowDialog();
			if (DiagRes == DialogResult.OK)
			{
				Properties.Settings.Default["ColorBack"] = ColorDiag.Color;
				lblMuestraBig.BackColor = ColorDiag.Color;
				Properties.Settings.Default.Save();

			}

		}

		private void BtnCancel_Click(object sender, EventArgs e)
		{
			this.DialogResult = DialogResult.Cancel;
			this.Close();
		}

		private void FrmAjustes_Load(object sender, EventArgs e)
		{
			lblMuestraBig.BackColor = (Color)Properties.Settings.Default["ColorBack"];
			lblMuestraBig.ForeColor = (Color)Properties.Settings.Default["ColorFont"];
		}
	}
}



La Aplicación es sencilla y no hace uso de todas las herramientas disponibles en la clase "Regex", pero para probar los ejemplos sirve bien. Cómo de costumbre el código lo puedes descargar de mi dropbox para poder probarlo.

Y bien, por ahora es todo, recuerda que los ejemplos de expresiones regulares que hemos visto en post anteriores, los puedes probar en este programa, aun no es a prueba de errores, pero eso lo veremos mas adelante.

Los leo luego.

No hay comentarios.