Manipulación y división de cadenas en C#

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 '.')

Etiquetas: dotnet CSharp string-manipulation Regex

Publicado el 10-13 21:06