sábado, 6 de septiembre de 2014

Pregunta C# (6 de 20): ¿Cómo Contar las Ocurrencias de una Cadena de Caracteres en un Objeto String?

Índice

0. Introducción
1. Contexto
1.1 ¿Qué es una cadena de caracteres?
1.2 Cadenas de caracteres en C#
2. Métodos de conteo
2.1 Fuerza bruta: ciclos
2.2 Expresiones regulares
3. Artefactos y Recursos
4. Conclusiones
5. Glosario
6. Literatura & Enlaces

0. Introducción

Sexta pregunta del curso de Twenty C# Explained Questions de Microsoft Virtual Academy, en esta oportunidad aprenderemos acerca del uso de varios elementos de programa para contar el número de ocurrencias de una cadena de caracteres en un objeto String. Este tipo de operación es común cuando trabajamos con texto y debe ser una habilidad esencial dentro de la caja de herramientas de un programador o desarrollador de software. Trabajaremos con dos enfoques de conteo: (primero) uso artesanal de ciclos, y uso de expresiones regulares para identificar patrones de cadenas dentro de otra cadena de caracteres.

1. Contexto

1.1 ¿Qué es una cadena de caracteres?

Una cadena de caracteres es una serie de elementos compuestos de caracteres individuales. Cada carácter integral de la cadena de caracteres puede ser de cualquier tipo; por nombrar algunos:
  • Números (0-9)
  • Letras mayúsculas (A-Z) y minúsculas (a-z)
  • Símbolos: *, -, #, (, [, ), ], /, ., ,, entre otros

1.2 Cadenas de caracteres en C#

En el contexto del lenguaje de programación C# una cadena de caracteres se representa por medio de objetos de la clase String [2]. El texto representado por una instancia de esta clase está compuesto por caracteres de tipo UNICODE (estándar internacional para la representación y manipulación de texto).

Este es un ejemplo de una cadena de caracteres en C#:

string cadenaCaracteres = "Lenguaje de Programación C#";

[Nota: Debido al propósito de este artículo omito la extensión sobre el tratamiento de cadenas de caracteres y el uso del objeto string, sin embargo en los artículos Caracteres y Cadenas de Caracteres y ¿Cuál es la Diferencia entre String y string? podrán encontrar mayor información junto con una variedad de ejemplos sobre este tipo de dato en C#.]

2. Métodos de Conteo

2.1 Fuerza bruta: Ciclos

El primer método de búsqueda de un carácter o una cadena de caracteres dentro de un objeto String es el uso de ciclos. Este enfoque puede resultar útil para comprender los primeros pasos introductorios y esenciales acerca de la manipulación de texto, sin embargo en tareas más exigentes resulta ser ineficiente y difícil de componer criterios de búsqueda avanzados (como los que podría utilizar un motor de búsqueda). Veamos un ejemplo sencillo en donde utilizamos el ciclo foreach para contar la cantidad de veces que aparece el carácter 'n' en una cadena de caracteres ("nanos gigantum humeris insidentes"):

Archivo C# FuerzaBrutaCiclos.cs [enlace alternativo]:

La variable contador (línea 10) llevará la cuenta de cada una de las ocurrencias de la letra 'n' (variable char ene en la línea 16) en la cadena representada por el objeto nanos de tipo string (línea 13). En el ciclo foreach (líneas 20-26) se lleva el conteo de cada coincidencia u ocurrencia del criterio de búsqueda (letra 'n') sobre la cadena "nanos gigantum humeris insidentes". Al final (línea 29) se muestra el resultado del número de ocurrencias halladas en la cadena y se presenta sobre la salida estándar.

Compilación:


  1. csc /target:exe FuerzaBrutaCiclos.cs

Ejecución assembly:


  1. .\FuerzaBrutaCiclos.exe

> Prueba de ejecución (ideone.com).

> Prueba de ejecución (local):
Ejecución assembly FuerzaBrutaCiclos.exe
Figura 1. Ejecución assembly FuerzaBrutaCiclos.exe.

2.2 Expresiones regulares

Una expresión regular o expresión racional es una secuencia de caracteres que conforman un patrón de búsqueda que puede ser usado sobre cadena de caracteres (String). Este método de búsqueda es mucho más avanzado que el tratado anteriormente (sección 2.1), y desde luego requiere de una inversión de tiempo mayor para comprender el uso de la sintaxis de composición de patrones de búsqueda y su aplicación. Un ejemplo clásico de expresión regular para determinar si una cadena de caracteres corresponde con el formato de una dirección de correo electrónico puede ser:

Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");

La cadena "^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$" corresponde con el patrón de búsqueda. (Más adelante cuando nos adentremos en el uso dedicado de expresiones regulares conoceremos el nombre de espacios System.Text.RegularExpressions [15] y los elementos de programas asociados a la búsqueda de texto.)

Ahora veamos un ejemplo en C# para encontrar el número de ocurrencias de la cadena de caracteres "la" sobre la cadena de caracteres "la lectura hace al hombre completo; la conversación ágil, y el escribir, preciso.":

Archivo ExpresionesRegulares.cs [enlace alternativo]:


Destaquemos las líneas 20-23:
  • Línea 20: El ciclo foreach permite iterar por cada una de las coincidencias encontradas por el método Matches [6]. Cada ocurrencia se generará como un tipo Match [7].
  • Línea 21: Incremento en una unidad del contador contador por cada ocurrencia de la cadena de caracteres "la" dentro de la cadena de caracteres cadena.
Compilación:


  1. csc /target:exe ExpresionesRegulares.cs

Ejecución assembly:


  1. .\ExpresionesRegulares.exe

> Prueba de ejecución (ideone.com).

> Prueba de ejecución (local):
Ejecución assembly ExpresionesRegulares.exe
Figura 2. Ejecución assembly ExpresionesRegulares.exe.

3. Artefactos y Recursos

Conjunto de artefactos generados a lo largo de la producción de este artículo:
Este es el vídeo en donde el equipo de expertos (Gerry O'Brein y Paul Pardi) de MVA responden y explican esta pregunta:

4. Conclusiones

Comprendimos el uso de dos métodos o enfoques para la búsqueda y conteo de las ocurrencias de una cadena de caracteres dentro de un objeto String: fuerza bruta (ciclos) y expresiones regulares. En futuras entregas bien sea de artículos o recetas nos concretaremos e invertiremos recursos en comprender a fondo la composición y uso de expresiones regulares. En la próxima pregunta trataremos con la verificación de si un número es potencia de 2.

5. Glosario

  • Búsqueda
  • Cadena de caracteres
  • Ciclo
  • Expresión regular
  • Fuerza bruta
  • Patrón de búsqueda
  • Unicode

6. Literatura & Enlaces

[1]: Twenty C# Questions Explained - http://www.microsoftvirtualacademy.com
[2]: String Class (System) - http://msdn.microsoft.com/en-us/library/system.string(v=vs.110).aspx
[3]: Caracteres y Cadenas de Caracteres en C# - Parte 2 | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2013/08/caracteres-y-cadenas-de-caracteres-en-c_29.html
[4]: Pregunta C# (3 de 20): ¿Cuál es la Diferencia entre String y string? | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2014/07/pregunta-csharp-3-de-20-cual-es-la-diferencia-entre-string-y-string.html
[5]: System.Text.RegularExpressions Namespace () - http://msdn.microsoft.com/en-us/library/system.text.regularexpressions(v=vs.110).aspx
[6]: Regex.Matches Method (String, String) (System.Text.RegularExpressions) - http://msdn.microsoft.com/en-us/library/b9712a7w(v=vs.110).aspx


A

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.