Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Sugerencia
Este artículo forma parte de la sección Aspectos básicos de los desarrolladores que ya conocen al menos un lenguaje de programación y están aprendiendo C#. Si no está familiarizado con la programación, comience primero con los tutoriales de introducción .
¿Viene de otro idioma? Los métodos de C# string, como Contains, StartsWith y IndexOf, son paralelos a los métodos String de Java y String.prototype de JavaScript. La principal diferencia es que algunas búsquedas de C# usan de forma predeterminada una comparación ordinal y sensible a mayúsculas y minúsculas. Otros usan por defecto la semántica de la referencia cultural actual. En el caso de las búsquedas orientadas al usuario, es posible que desee pasar un StringComparison valor.
La String clase incluye métodos que responden a dos preguntas cotidianas:
- ¿Esta cadena contiene ese texto? — usa Contains, StartsWith o EndsWith.
- ¿Dónde se produce ese texto? — usa IndexOf o LastIndexOf.
Los algoritmos de búsqueda y reemplazo más complejos se pueden crear mediante expresiones regulares. Para obtener más información sobre expresiones regulares y otras operaciones de cadena, consulte el artículo de referencia del lenguaje sobre operaciones de cadena.
Comprobar si una cadena contiene texto
Use Contains, StartsWitho EndsWith para probar la presencia de una subcadena:
string factMessage = "Extension methods have all the capabilities of regular static methods.";
// Write the string and include the quotation marks.
Console.WriteLine($"\"{factMessage}\"");
// Default comparisons are case sensitive.
bool containsSearchResult = factMessage.Contains("extension");
Console.WriteLine($"""Contains "extension"? {containsSearchResult}""");
// For user-facing searches, pass a StringComparison value to control case and culture.
bool ignoreCaseSearchResult = factMessage.StartsWith("extension", StringComparison.CurrentCultureIgnoreCase);
Console.WriteLine($"""Starts with "extension"? {ignoreCaseSearchResult} (ignoring case)""");
bool endsWithSearchResult = factMessage.EndsWith(".", StringComparison.Ordinal);
Console.WriteLine($"Ends with '.'? {endsWithSearchResult}");
// => "Extension methods have all the capabilities of regular static methods."
// => Contains "extension"? False
// => Starts with "extension"? True (ignoring case)
// => Ends with '.'? True
Estos métodos usan de forma predeterminada una comparación ordinal que distingue entre mayúsculas y minúsculas. Para aceptar la entrada del usuario o no distinguir entre mayúsculas y minúsculas en el texto mostrado, pase un valor StringComparison como StringComparison.CurrentCultureIgnoreCase o StringComparison.OrdinalIgnoreCase.
Cuando busque un solo carácter, utilice la sobrecarga char de Contains. Evita asignar una cadena de un carácter y es más directa:
string path = "/usr/local/bin";
bool hasSlash = path.Contains('/');
Console.WriteLine($"Path contains '/': {hasSlash}");
// => Path contains '/': True
Ubique la posición del texto
IndexOf devuelve el índice de base cero de la primera aparición de una subcadena (o carácter) y LastIndexOf devuelve el índice de la última aparición. Ambos devuelven -1 cuando el texto de búsqueda no está presente. Combínelos para extraer el texto entre dos marcadores:
string factMessage = "Extension methods have all the capabilities of regular static methods.";
Console.WriteLine($"\"{factMessage}\"");
// Extract the text between the first and last occurrence of "methods".
int first = factMessage.IndexOf("methods") + "methods".Length;
int last = factMessage.LastIndexOf("methods");
string between = factMessage.Substring(first, last - first);
Console.WriteLine($"""Substring between "methods" and "methods": '{between}'""");
// => "Extension methods have all the capabilities of regular static methods."
// => Substring between "methods" and "methods": ' have all the capabilities of regular static '
Cuando necesite cada repetición en lugar de la primera o la última, realice una iteración pasando el resultado anterior más uno como startIndex argumento o cambie a una expresión regular.
Elección de la comparación correcta
La mayoría de las sobrecargas de búsqueda aceptan un valor opcional StringComparison . Selecciónelo en función del tipo de datos que está buscando:
- Si busca identificadores, rutas de acceso de archivo, tokens de protocolo o cualquier otra cosa definida por la máquina, use Ordinal.
- Si está buscando el mismo tipo de datos definidos por la máquina, pero quiere que la búsqueda no distinga entre mayúsculas y minúsculas, use OrdinalIgnoreCase.
- Si busca texto visible para usuarios al que deban aplicarse las reglas de la configuración regional actual, use CurrentCulture.
- Si buscas ese mismo texto visible para el usuario y quieres ignorar la distinción entre mayúsculas y minúsculas, usa CurrentCultureIgnoreCase.
- Si busca datos persistentes que deben compararse con los mismos en cada máquina y referencia cultural, use InvariantCulture (rara vez es necesario).
La comparación ordinal es la opción más rápida y el valor predeterminado adecuado para cualquier cosa que no sea texto de lenguaje natural. La comparación que tiene en cuenta la referencia cultural es significativamente más lenta y puede producir resultados sorprendentes. Por ejemplo, en algunas culturas, la minúscula i no coincide con una mayúscula I. Resérvelo para las búsquedas que los usuarios realicen sobre texto en prosa.
Para obtener una explicación detallada de la comparación que tiene en cuenta la referencia cultural, consulte Prácticas recomendadas para comparar cadenas.