1. Buscar una subcadena en un string
En la lección anterior aprendiste a obtener una subcadena de un string. Ahora vamos a aprender a encontrar un string dentro de otro. Para esto hay 5 métodos buenísimos:
Método Contains: ¿el string contiene la subcadena?
Devuelve true si el string pasado está contenido en el string donde llamaste el método.
string phrase = "Viento de cambios";
bool hasWord = phrase.Contains("cambios"); // true
¡La búsqueda distingue entre mayúsculas y minúsculas! "viento".Contains("V") — false.
Método IndexOf: encontrar la posición de la subcadena
Muy parecido a cómo funciona IndexOf en arrays: busca una subcadena en el string (de principio a fin) y devuelve el índice de la primera aparición de la subcadena.
string text = "sandíamelsandía";
int index = text.IndexOf("mel"); // 2
- Si no encuentra nada, devuelve -1.
- Hay una alternativa con posición inicial: IndexOf("mel", 4). Igual que en los arrays.
Método LastIndexOf: última aparición
También parecido a LastIndexOf en arrays: busca una subcadena en el string (de final a principio) y devuelve el índice de la primera aparición de la subcadena desde el final.
string repeated = "tarea tarea";
int last = repeated.LastIndexOf("tarea"); // 7
¿Empieza/termina el string con una subcadena?
Muchas veces necesitas comprobar si tu string empieza (o termina) con una subcadena concreta. Para eso hay dos métodos:
- StartsWith — comprueba si el string empieza con una subcadena;
- EndsWith — comprueba si el string termina con una subcadena.
string fileName = "foto.jpg";
bool isJpg = fileName.EndsWith(".jpg"); // true
string email = "soporte@company.com";
bool isSupport = email.StartsWith("soporte"); // true
Si quieres comparar sin distinguir mayúsculas y minúsculas, tienes que pasar un parámetro extra indicando el modo de comparación (mira la documentación para StringComparison.OrdinalIgnoreCase).
2. Método Replace: reemplazar caracteres y subcadenas
El método Replace reemplaza todas las apariciones del string A por el string B. ¡Apareció como herramienta para luchar contra los typos, la censura y para reemplazar variables en plantillas! (Es broma.)
string address = "Londres, calle Baker-street";
string updated = address.Replace("Londres", "París");
Console.WriteLine(updated); // "París, calle Baker-street"
- Puedes reemplazar incluso caracteres individuales: str.Replace('a', 'z')
- Importante: todos los reemplazos se hacen en todo el string, no solo en la primera aparición.
3. Método Split: cortamos el string en trozos
El método Split hace lo siguiente: toma tu string y lo corta en partes usando separadores — caracteres o strings por los que hay que dividir. El método devuelve un array de strings en los que ha cortado el string original.
string[] parts = originalString.Split(separator);
- separator — carácter o array de caracteres que se usarán como separador.
El ejemplo más simple
Dividimos el string por espacio:
string input = "manzana pera naranja plátano";
string[] fruits = input.Split(' '); // contiene el array ["manzana","pera","naranja","plátano"]
Console.WriteLine(fruits[0]); // "manzana"
Console.WriteLine(fruits[1]); // "pera"
Aquí obtenemos un array de strings de longitud 4, donde cada palabra es un elemento separado del array.
Varios separadores
A veces en el string puede haber más de un tipo de separador. Por ejemplo, el usuario pudo meter valores separados por espacio, coma o punto y coma.
En estos casos puedes usar un array de caracteres separadores:
string input = "manzana, pera; naranja plátano";
char[] separators = { ' ', ',', ';' };
string[] fruits = input.Split(separators, StringSplitOptions.RemoveEmptyEntries);
Bonus: el parámetro opcional StringSplitOptions.RemoveEmptyEntries elimina fragmentos vacíos. Esto es útil si el usuario mete varios separadores seguidos — por ejemplo, dos espacios o algo como "manzana,, pera".
Dividir por subcadena
Los separadores pueden ser strings, no solo caracteres. Por ejemplo, si tienes un archivo CSV con separador ";" o |:
// Separador por un solo carácter
string data = "Ivanov;Petrov;Sidorov";
string[] names = data.Split(';'); // por el carácter ';'
// O si el separador es un string entero:
string log = "2024-01-01::Error::No se pudo completar la tarea";
string[] separators = { "::" };
string[] parts = log.Split(separators);
4. Método Join: juntamos el array de strings de nuevo
El método Join hace lo contrario: toma un array de strings y los une en un solo string, poniendo entre los elementos el separador que elijas.
string result = string.Join(separator, arrayOfStrings);
- separator — string que se insertará entre los elementos.
- arrayOfStrings — array o colección de strings (string[], List<string> y otros).
El ejemplo más sencillo
Creamos de un array de strings un solo string con comas:
string[] items = { "manzana", "pera", "naranja", "plátano" };
string joined = string.Join(", ", items);
Console.WriteLine(joined); // "manzana, pera, naranja, plátano"
Unir con separador vacío — pegamos los strings en uno solo
A veces solo quieres juntar los strings seguidos, sin poner nada entre ellos:
string[] parts = { "Yo", "amo", "C#" };
string message = string.Join("", parts);
Console.WriteLine(message); // "YoamoC#"
5. Errores típicos
Muy a menudo los que empiezan se olvidan de quitar los espacios extra después de dividir el string con Split. Por ejemplo, si el usuario se le va la mano y escribe "manzana, pera ,plátano", después de Split tendrás elementos como " pera ". Si conviertes a números o comparas, tendrás un bug. Usa Trim() después de Split para cada elemento — es una buena costumbre.
Otro tema — strings vacíos de más. Cuando el usuario mete dos separadores seguidos o empieza y termina el string con un separador, Split puede devolver elementos vacíos. Activa StringSplitOptions.RemoveEmptyEntries para no pillar errores después.
Si el array para Join tiene elementos vacíos o null, Join simplemente los ignora. Pero si no quieres eso (por ejemplo, si en un informe es importante mostrar que algunos valores faltan), tendrás que procesar el array a mano antes.
Y otra cosa: Split nunca cambia el string original, sino que devuelve un array nuevo. Join tampoco cambia el array original, sino que da un string nuevo. Recuerda: los strings y arrays en C# son inmutables (no se pueden cambiar).
GO TO FULL VERSION