Buscando cadenas dentro de cadenas en C#

Feb 27, 2013 Codigos C# Tutoriales C# 6 comentarios

Pues hace tiempo que no escribo nada en el blog, sobre todo porque he estado muy ocupado en otras cosas y por razones de la vida ya no programo mucho con C#, pero quiero compartir con ustedes algunos trucos a la hora de buscar y comparar strings con C#.

Cuando digo cadenas, por supuesto que me refiero a cadenas de caracteres, esto de traducir la programación al español es un dolor de cabeza, por ejemplo, como traducimos array? vector o arreglo? pero bueno, ese es otro tema, vayamos a lo que importa:

Veamos los métodos de la clase String en C# para la búsqueda de cadenas:

1. IndexOf, Retorna el índice de la primera ocurrencia de un String o uno o más caracteres de una instancia

2. LastIndexOf, Lo mismo que el anterior, solo que retorna la última ocurrencia

3. StartsWith, Como su nombre indica, retorna true o false dependiendo de si la cadena que se le pasa empieza con una cadena de caracteres dada

4. EndsWith, Lo mismo que el anterior, pero verifica que la cadena buscada esté al final.

5. Contains, parecido a IndexOf, solo que en vez de retornar la posición, retorna true o false.

Ejemplos

Tomemos la siguiente cadena para los ejemplos:

string str = "A silly sentence used for silly purposes.";

1. Usando IndexOf() y LastIndexOf():

int first = str.IndexOf("silly"); //Primera ocurrencia de "silly"
int last = str.LastIndexOf("silly"); //Última ocurrencia de "silly"
 
//Tomemos ahora el texto que hay entre la primera y la última ocurrencia de "silly"
string str2 = str.Substring(first, last - first);
Console.WriteLine("between two 'silly' words: '{0}'", str2);

Nota: Hace un tiempo escribí un post sobre algunos ejercicios resueltos con string, y hay uno con Substring()

2. Usando StartsWith() y EndsWith():

 bool test1 = str.StartsWith("a silly"); //retorna falso, en 3 verás por que
 Console.WriteLine("starts with 'a silly'? {0}", test1);
 bool test2 = str.EndsWith(".");
 Console.WriteLine("ends with '.'? {0}", test2);

3. Que pasa si no nos importan mayúsculas y minúsculas?

Cuando estamos buscando un texto, C# por defecto es Case Sensitive (sensible a las mayúsculas y minúsculas), es por eso que en el ejemplo 2, str.StartsWith(“a silly”) retorna false. Como podemos hacer que ignore si el texto que buscamos está en mayúsculas o no? Pasando como segundo parámetro algún valor del enum StringComparison, modifiquemos un poco el ejemplo 2:

bool test2 = str.StartsWith("a silly", System.StringComparison.OrdinalIgnoreCase);
Console.WriteLine("starts with 'a silly'? {0} (ignoring case)", test2); //ahora si retorna true

Nota: StringComparison tambien se lo podemos pasar a los otros métodos mencionados.

4. Hagamos un Contains que sea Case Sensitive

Ojalá no te hayas perdido mi post anterior sobre Métodos Extensores en C#, porque justamente ahora lo vamos a aplicar, para agregar otro método Contains() a la clase String de C#, que no diferencie entre mayúsculas y minúsculas:

public static bool Contains(this string source, string target, StringComparison comparer)
{
    if (source == null) //Source no puede ser null
        throw new ArgumentNullException("source");
    return source.IndexOf(target, comparer) != -1;
}

5. Un truquito:

string s = "lorem ipsum dolor";
bool isIpsum = s.Contains("ipsum");

es lo mismo que:

bool isIpsum = "lorem ipsum dolor".Contains("ipsum");
//el operador new está implícito

Como siempre, cualquier pregunta que tengas, en los comentarios

Compartir:

Relacionados

algunos artículos que te pueden interesar

6 comentarios

Forma parte de nuestra discusión y síguela de cerca

Excelente tu aporte me gsuta tu idea de compartir los conocimientos y te agradesco, pero como podria hacer uso de esta busqueda en un programa que guarda los registros de el departamento, el encargado, el telefono y direccion en un arreglos o archivo binario y poder buscarlo a mi gusto en una windows form. Del cual yo he logrado que solo vaya a la primera linea de registro y ir en orden como se metio los registros pero no puedo retoceder o ir a una linea que yo quiero.

Autor: Angel Uriel Miranda Pérez | Fecha: Mar 18, 2013.

Excelentes post, la verdad ya extrañaba un poco que publicaras algo. Saludos

Autor: Alfredo Cabrera | Fecha: Mar 18, 2013.

@Angel: La parte del windows form es muy tediosa como para publicar todo el código aquí, pero solo tienes que programar lo que quieres hacer dentro de los eventos de los botones y los campos y después mostrarlo en un textbox o donde desees. Si estás trabajando con arrays, entonces deberás usar otras funciones dentro de la clase Array, aquí en este mismo blog hay unos cuantos post sobre como buscar y trabajar con arrays, ya archivos binarios es otro asunto más complicado.

@Alfredo, hasta yo extrañaba publicar algo, la verdad no tengo mucho tiempo como antes, pero trataré de publicar al menos 1 vez al mes, aunque sea un post corto.

Autor: Tomy | Fecha: Mar 28, 2013.

Saludos bueno un favor nose si podria conseguir respuestas rapidas pero bueno Mi problema es el siguiente, soy nuevo en programacion con C# y bueno me piden desglozar en varios txt un texto con pipes ej
hola|mundo|0|como|estan|

necesitos dessglozar todos esos campos en diferentes textbox para guardarlos a un grid Xfa ayudenme

Autor: johnny | Fecha: Dic 19, 2013.

Hola,
Comento que he realizado un datalogger con un Arduino, reloj en tiempo real y una memoria SD donde almacenare los datos de un pluviometro, pero ahora he querido empezar a graficar esos datos, mis conocimientos en C# son básicos solo lo he usado para hacer terminales para puerto serial. Me gustaría saber si conoces un comando o a grandes rasgos explicarme como podría yo buscar en mi archivo .txt o .CSV una fecha en especifico ya que grabo en un mismo archivo datos de todo los dias y horas hasta llenar la memoria y eso me hace que usar una función o comando que me busque por ejemplo todo los datos que hay del 11/02/14. Creo que usando IndexOf y LastIndexOf podría yo localizar ese intervalo pero en si lo que necesito es saber la cantidad que hay entre estos por decir en esa fecha hubieron 32 lecturas y sabiendo esa cantidad sumar. No quiero aprovechar de tu tiempo pero si no existe un ejemplo basico que pudieras hacer pedirte algunos comandos que podrían servir y con gusto me pongo a leer.

Un saludo y gracias anticipadas por leer el comentario.

Autor: Julio | Fecha: Feb 11, 2014.

Una solución bastante viable para buscar una cadena de texto dentro de otra cadena de texto, lo que mas me gusta de C# es lo “limpio” que se ve el código. Cada cierto tiempo aprendo nuevas funciones que ya trae incorporadas el lenguaje y me sorprendo de lo versatil que es.

Saludos!

Autor: Eduardo | Fecha: May 18, 2014.

Escribe tu comentario

Requerido.

Requerido. No público.

Si tienes alguno.