En el desarrollo con .NET, la manipulación de cadenas es una de las tareas más comunes. La clase System.String y el motor de expresiones regulares ofrecen múltiples formas de segmentar información según separadores simples o patrones complejos.
Uso del método String.Split
El enfoque más directo para dividir una cadena es el método Split. Este fragmenta un texto basándose en uno o varios caracteres delimitadores.
string datosEntrada = "C#;Java;Python;Rust";
string[] lenguajes = datosEntrada.Split(new char[] { ';' });
// Resultado:
// lenguajes[0] = "C#"
// lenguajes[1] = "Java"
// lenguajes[2] = "Python"
// lenguajes[3] = "Rust"
Segmentación avanzada con Expresiones Regulares (Regex)
Cuando la cadena presenta una estructura heterogénea o patrones específicos, la clase Regex del espacio de nombres System.Text.RegularExpressions es la herramienta ideal.
using System;
using System.Text.RegularExpressions;
public class AnalizadorProcesos
{
public static void Main()
{
string[] registros = { "PROCESO_1: 500ms", "PROCESO_2: 120ms", "ERROR: 0ms" };
string patron = @"(\w+):\s+(\d+)ms";
foreach (var linea in registros)
{
foreach (Match coincidencia in Regex.Matches(linea, patron))
{
string nombre = coincidencia.Groups[1].Value;
int tiempo = Int32.Parse(coincidencia.Groups[2].Value);
Console.WriteLine($"Tarea: {nombre} | Duración: {tiempo} milisegundos");
}
}
}
}
También es posible extraer contenido delimitado por símbolos específicos, como corchetes o llaves, utilizando capturas de grupos:
using System;
using System.Text.RegularExpressions;
public class ExtractorContenido
{
public static void Main()
{
string metadata = "{Autor: Cervantes}{Libro: Quijote}{Año: 1605}";
string patronBusqueda = @"\{([^\{\}]+)\}";
var coincidencias = Regex.Matches(metadata, patronBusqueda);
for (int i = 0; i < coincidencias.Count; i++)
{
Console.WriteLine($"Bloque {i + 1}: {coincidencias[i].Groups[1].Value}");
}
}
}
Búsqueda y extracción manual mediante índices
Para escenarios donde no se requiere la poetncia de Regex, los métodos de búsqueda de índices permiten localizar posiciones exactas para realizar cortes manuales con Substring.
- IndexOf / LastIndexOf: Encuentran la primera o última aparición de un carácter o subcadena.
- IndexOfAny / LastIndexOfAny: Localizan la primera o última posición de cualquier elemento contenido en un array de caracteres.
using System;
using System.Collections.Generic;
public class BuscadorTexto
{
public static void Main()
{
string parrafo = "El código debe ser limpio. También debe ser eficiente. Y, sobre todo, legible.";
List<string> oraciones = new List<string>();
int puntero = 0;
int indicePunto;
while ((indicePunto = parrafo.IndexOf('.', puntero)) != -1)
{
string fragmento = parrafo.Substring(puntero, indicePunto - puntero + 1).Trim();
oraciones.Add(fragmento);
puntero = indicePunto + 1;
}
foreach (var item in oraciones)
Console.WriteLine(item);
}
}
Parámetros de los métodos de búsqueda
Los métodos como IndexOf e IndexOfAny cuentan con diversas sobrecargas que permiten optimizar la búsqueda:
int IndexOf(string value, int startIndex, int count)
- value: El contenido que se desea buscar.
- startIndex: La posición inicial dentro de la cadena original.
- count: El número de caracteres a examinar a partir de la posición inicial.
Un ejemplo práctico del uso de IndexOfAny para detectar delimitadores múltiples:
string ruta = "usuario/documentos/archivo.txt";
char[] separadores = { '/', '.' };
int primerMatch = ruta.IndexOfAny(separadores); // Retorna 7 (posición de '/')
int ultimoMatch = ruta.LastIndexOfAny(separadores); // Retorna 26 (posición de '.')