Cómo: Buscar cadenasHow to: search strings

Puede usar dos estrategias principales para buscar texto en cadenas.You can use two main strategies to search for text in strings. Los métodos de la clase String buscan un texto concreto.Methods of the String class search for specific text. Las expresiones regulares buscan patrones en el texto.Regular expressions search for patterns in text.

Nota

Los ejemplos de C# de este artículo se ejecutan en el ejecutor de código en línea y área de juegos de Try.NET.The C# examples in this article run in the Try.NET inline code runner and playground. Haga clic en el botón Ejecutar para ejecutar un ejemplo en una ventana interactiva.Select the Run button to run an example in an interactive window. Una vez que se ejecuta el código, puede modificar y ejecutar el código modificado si vuelve a hacer clic en Ejecutar.Once you execute the code, you can modify it and run the modified code by selecting Run again. El código modificado se ejecuta en la ventana interactiva o, si se produce un error en la compilación, en la ventana interactiva se muestran todos los mensajes de error del compilador de C#.The modified code either runs in the interactive window or, if compilation fails, the interactive window displays all C# compiler error messages.

El tipo string, que es un alias de la clase System.String, proporciona una serie de métodos útiles para buscar el contenido de una cadena.The string type, which is an alias for the System.String class, provides a number of useful methods for searching the contents of a string. Entre ellos se encuentran Contains, StartsWith, EndsWith, IndexOf y LastIndexOf.Among them are Contains, StartsWith, EndsWith, IndexOf, LastIndexOf. La clase System.Text.RegularExpressions.Regex proporciona un vocabulario completo para buscar patrones en el texto.The System.Text.RegularExpressions.Regex class provides a rich vocabulary to search for patterns in text. En este artículo, aprenderá estas técnicas y a elegir el mejor método para sus necesidades.In this article, you learn these techniques and how to choose the best method for your needs.

¿Una cadena contiene texto?Does a string contain text?

Los métodos String.Contains, String.StartsWith y String.EndsWith buscan texto concreto en una cadena.The String.Contains, String.StartsWith and String.EndsWith methods search a string for specific text. En el ejemplo siguiente, se muestra cada uno de estos métodos y una variación que usa una búsqueda que no distingue mayúsculas de minúsculas:The following example shows each of these methods and a variation that uses a case insensitive search:

string factMessage = "Extension methods have all the capabilities of regular static methods.";

// Write the string and include the quotation marks.
Console.WriteLine($"\"{factMessage}\"");

// Simple comparisons are always case sensitive!
bool containsSearchResult = factMessage.Contains("extension");
Console.WriteLine($"Starts with \"extension\"? {containsSearchResult}");

// For user input and strings that will be displayed to the end user, 
// use the StringComparison parameter on methods that have it to specify how to match strings.
bool ignoreCaseSearchResult = factMessage.StartsWith("extension", System.StringComparison.CurrentCultureIgnoreCase);
Console.WriteLine($"Starts with \"extension\"? {ignoreCaseSearchResult} (ignoring case)");

bool endsWithSearchResult = factMessage.EndsWith(".", System.StringComparison.CurrentCultureIgnoreCase);
Console.WriteLine($"Ends with '.'? {endsWithSearchResult}");

En el ejemplo anterior, se muestra un aspecto importante del uso de estos métodos.The preceding example demonstrates an important point for using these methods. De manera predeterminada, las búsquedas distinguen mayúsculas de minúsculas.Searches are case-sensitive by default. Use el valor de enumeración StringComparison.CurrentCultureIgnoreCase para especificar que se trata de una búsqueda que no distingue mayúsculas de minúsculas.You use the StringComparison.CurrentCultureIgnoreCase enum value to specify a case insensitive search.

¿Dónde se encuentra el texto buscado en una cadena?Where does the sought text occur in a string?

Los métodos IndexOf y LastIndexOf también buscan texto en cadenas.The IndexOf and LastIndexOf methods also search for text in strings. Estos métodos devuelven la ubicación del texto que se busca.These methods return the location of the text being sought. Si no se encuentra el texto, devuelven -1.If the text isn't found, they return -1. En el ejemplo siguiente, se muestra una búsqueda de la primera y última aparición de la palabra "methods" y muestra el texto que hay en medio.The following example shows a search for the first and last occurrence of the word "methods" and displays the text in between.

string factMessage = "Extension methods have all the capabilities of regular static methods.";

// Write the string and include the quotation marks.
Console.WriteLine($"\"{factMessage}\"");

// This search returns the substring between two strings, so 
// the first index is moved to the character just after the first string.
int first = factMessage.IndexOf("methods") + "methods".Length;
int last = factMessage.LastIndexOf("methods");
string str2 = factMessage.Substring(first, last - first);
Console.WriteLine($"Substring between \"methods\" and \"methods\": '{str2}'");

Buscar texto concreto mediante expresiones regularesFinding specific text using regular expressions

La clase System.Text.RegularExpressions.Regex se puede usar para buscar cadenas.The System.Text.RegularExpressions.Regex class can be used to search strings. Estas búsquedas pueden abarcar una complejidad que va desde patrones de texto simples hasta otros complejos.These searches can range in complexity from simple to complicated text patterns.

En el ejemplo de código siguiente, se busca la palabra "the" o "their" en una oración, sin distinción entre mayúsculas y minúsculas.The following code example searches for the word "the" or "their" in a sentence, ignoring case. El método estático Regex.IsMatch realiza la búsqueda.The static method Regex.IsMatch performs the search. Se proporciona la cadena de búsqueda y un patrón de búsqueda.You give it the string to search and a search pattern. En este caso, un tercer argumento especifica que la búsqueda no distingue mayúsculas de minúsculas.In this case, a third argument specifies case-insensitive search. Para obtener más información, vea System.Text.RegularExpressions.RegexOptions.For more information, see System.Text.RegularExpressions.RegexOptions.

El patrón de búsqueda describe el texto que se busca.The search pattern describes the text you search for. En la tabla siguiente, se describe cada elemento del patrón de búsqueda.The following table describes each element of the search pattern. (En la tabla siguiente, se usa el valor único \ que se deben escribir como \\ en una cadena de C#).(The table below uses the single \ which must be escaped as \\ in a C# string).

patternpattern SignificadoMeaning
secciónthe busca coincidencias con el texto "the"match the text "the"
(eir)?(eir)? busca coincidencias con 0 o 1 apariciones de "eir"match 0 or 1 occurrence of "eir"
\s\s busca coincidencias con un carácter de espacio en blancomatch a white-space character
string[] sentences =
{
    "Put the water over there.",
    "They're quite thirsty.",
    "Their water bottles broke."
};

string sPattern = "the(ir)?\\s";

foreach (string s in sentences)
{
    Console.Write($"{s,24}");

    if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
    {
        Console.WriteLine($"  (match for '{sPattern}' found)");
    }
    else
    {
        Console.WriteLine();
    }
}

Sugerencia

Los métodos string suelen ser mejores opciones cuando se busca una cadena exacta.The string methods are usually better choices when you are searching for an exact string. Las expresiones regulares son mejores cuando se busca algún patrón en una cadena de origen.Regular expressions are better when you are searching for some pattern is a source string.

¿Una cadena sigue un patrón?Does a string follow a pattern?

El código siguiente usa expresiones regulares para validar el formato de cada cadena de una matriz.The following code uses regular expressions to validate the format of each string in an array. La validación requiere que cada cadena tenga la forma de un número de teléfono en el que tres grupos de dígitos se separan por guiones. Los dos primeros grupos contienen tres dígitos y el tercero, cuatro.The validation requires that each string have the form of a telephone number in which three groups of digits are separated by dashes, the first two groups contain three digits, and the third group contains four digits. El patrón de búsqueda usa la expresión regular ^\\d{3}-\\d{3}-\\d{4}$.The search pattern uses the regular expression ^\\d{3}-\\d{3}-\\d{4}$. Para obtener más información, consulte Lenguaje de expresiones regulares: Referencia rápida.For more information, see Regular Expression Language - Quick Reference.

patternpattern SignificadoMeaning
^ busca coincidencias con el principio de la cadenamatches the beginning of the string
\d{3}\d{3} busca coincidencias con exactamente 3 caracteres de dígitosmatches exactly 3 digit characters
- busca coincidencias con el carácter “-”matches the '-' character
\d{3}\d{3} busca coincidencias con exactamente 3 caracteres de dígitosmatches exactly 3 digit characters
- busca coincidencias con el carácter “-”matches the '-' character
\d{4}\d{4} busca coincidencias con exactamente 4 caracteres de dígitosmatches exactly 4 digit characters
$ busca coincidencias con el final de la cadenamatches the end of the string
string[] numbers =
{
    "123-555-0190",
    "444-234-22450",
    "690-555-0178",
    "146-893-232",
    "146-555-0122",
    "4007-555-0111",
    "407-555-0111",
    "407-2-5555",
    "407-555-8974",
    "407-2ab-5555",
    "690-555-8148",
    "146-893-232-"
};

string sPattern = "^\\d{3}-\\d{3}-\\d{4}$";

foreach (string s in numbers)
{
    Console.Write($"{s,14}");

    if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern))
    {
        Console.WriteLine(" - valid");
    }
    else
    {
        Console.WriteLine(" - invalid");
    }
}

Este patrón de búsqueda sencillo coincide con muchas cadenas válidas.This single search pattern matches many valid strings. Las expresiones regulares son mejores para buscar o validar con respecto a un patrón, en lugar de una cadena de texto sencilla.Regular expressions are better to search for or validate against a pattern, rather than a single text string.

Eche un vistazo al código de nuestro repositorio de GitHub y pruebe estos ejemplos.You can try these samples by looking at the code in our GitHub repository. O bien, puede descargar los ejemplos como un archivo ZIP.Or you can download the samples as a zip file.

Vea tambiénSee also