¿Hay alguna manera de hacer que el siguiente retorno sea verdadero?
string title = "ASTRINGTOTEST";
title.Contains("string");
No parece haber una sobrecarga que me permita establecer la sensibilidad a mayúsculas y minúsculas. Actualmente, MAYÚSCULAS a ambos, pero eso es una tontería (por lo que me estoy refiriendo a los problemas de i18n que vienen con mayúsculas y minúsculas ).
ACTUALIZACIÓN
Esta pregunta es antigua y desde entonces me di cuenta de que pedí una respuesta simple para un tema realmente vasto y difícil si te interesa investigarlo a fondo.
Para la mayoría de los casos, en bases de código en inglés, monolingües, esta respuesta será suficiente. Sospecho que porque la mayoría de las personas que vienen aquí entran en esta categoría, esta es la respuesta más popular.
Sin embargo, esta respuesta plantea el problema inherente de que no podemos comparar las mayúsculas y minúsculas del texto hasta que sepamos que ambos textos son de la misma cultura y sabemos cuál es esa cultura. Esta es quizás una respuesta menos popular, pero creo que es más correcta y es por eso que la marqué como tal.
fuente
culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0
? Utiliza la cultura correcta y no distingue entre mayúsculas y minúsculas, no asigna cadenas temporales en minúsculas, y evita la pregunta de si convertir a minúsculas y comparar es siempre lo mismo que una comparación entre mayúsculas y minúsculas.Puede usar el método String.IndexOf y pasar
StringComparison.OrdinalIgnoreCase
como el tipo de búsqueda a usar:Aún mejor es definir un nuevo método de extensión para la cadena:
Tenga en cuenta que esa propagación nula
?.
está disponible desde C # 6.0 (VS 2015), para versiones anteriores useUSO:
fuente
paragraph.ToLower(culture).Contains(word.ToLower(culture))
conCultureInfo.InvariantCulture
y no resuelve ningún problema de localización. ¿Por qué complicar más las cosas? stackoverflow.com/a/15464440/284795ToLower
versión incluye 2 asignaciones que son innecesarias en una operación de comparación / búsqueda. ¿Por qué asignar innecesariamente en un escenario que no lo requiere?string
es unaIEnumerable<char>
de ahí que no se puede utilizar para buscar subcadenasstring.IndexOf(string)
es usar la cultura actual, mientras que el valor predeterminado parastring.Contains(string)
es usar el comparador ordinal. Como sabemos, el primero se puede cambiar eligiendo una sobrecarga más larga, mientras que el segundo no se puede cambiar. Una consecuencia de esta inconsistencia es el siguiente ejemplo de código:Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; string self = "Waldstrasse"; string value = "straße"; Console.WriteLine(self.Contains(value));/* False */ Console.WriteLine(self.IndexOf(value) >= 0);/* True */
Puedes usar
IndexOf()
así:Como 0 (cero) puede ser un índice, verifica con -1.
MSDN
fuente
Solución alternativa usando Regex:
fuente
RegexOptions.IgnoreCase & RegexOptions.IgnorePatternWhitespace & RegexOptions.CultureInvariant;
para cualquier persona si ayuda."."
en"This is a sample string that doesn't contain the search string"
. O intente buscar"(invalid"
, para el caso.Regex.Escape
podría ayudar. Regex todavía parece innecesario cuandoIndexOf
/ extensionContains
es simple (y posiblemente más claro).Siempre puedes subir o bajar las cuerdas primero.
Vaya, acabo de ver eso último. Una comparación que no distinga entre mayúsculas y minúsculas
*
probablemente*
haría lo mismo de todos modos, y si el rendimiento no es un problema, no veo un problema al crear copias en mayúsculas y compararlas. Podría haber jurado que una vez vi una comparación entre mayúsculas y minúsculas una vez ...fuente
.NET Core 2.0+ solamente (a partir de ahora)
.NET Core ha tenido un par de métodos para lidiar con esto desde la versión 2.0:
Ejemplo:
Con el tiempo, probablemente llegarán al estándar .NET y, a partir de ahí, a todas las demás implementaciones de la biblioteca de clases base.
fuente
Un problema con la respuesta es que arrojará una excepción si una cadena es nula. Puede agregar eso como un cheque para que no:
fuente
if (string.IsNullOrEmpty(source)) return string.IsNullOrEmpty(toCheck);
La clase StringExtension es el camino a seguir, he combinado un par de las publicaciones anteriores para dar un ejemplo de código completo:
fuente
StringComparison
?Esto es limpio y simple.
fuente
fileNamestr
tiene caracteres especiales de expresiones regulares (p*
. Ej+
..
, Etc.), se encontrará con una gran sorpresa. La única forma de hacer que esta solución funcione como unaContains
función adecuada es escaparfileNamestr
haciendoRegex.Escape(fileNamestr)
.OrdinalIgnoreCase, CurrentCultureIgnoreCase o InvariantCultureIgnoreCase?
Como esto falta, aquí hay algunas recomendaciones sobre cuándo usar cuál:
Dos
StringComparison.OrdinalIgnoreCase
para las comparaciones como su valor predeterminado seguro para la coincidencia de cadenas independiente de la cultura.StringComparison.OrdinalIgnoreCase
comparaciones para aumentar la velocidad.StringComparison.CurrentCulture-based
operaciones de cadena cuando muestre la salida al usuario.StringComparison.Ordinal
oStringComparison.OrdinalIgnoreCase
cuando la comparación sealingüísticamente irrelevante (simbólica, por ejemplo).
ToUpperInvariant
lugar deToLowerInvariant
normalizar cadenas para comparar.No hacer
StringComparison.InvariantCulture
cadena basadasen la mayoría de los casos; Una de las pocas excepciones sería la
persistencia de datos lingüísticamente significativos pero culturalmente agnósticos.
Según estas reglas, debe usar:
mientras que [YourDecision] depende de las recomendaciones de arriba.
enlace de fuente: http://msdn.microsoft.com/en-us/library/ms973919.aspx
fuente
Estas son las soluciones más fáciles.
Por índice de
Al cambiar de caso
Por Regex
fuente
Sé que este no es el C #, pero en el marco (VB.NET) ya existe tal función
Variante C #:
fuente
El
InStr
método del ensamblado VisualBasic es el mejor si le preocupa la internacionalización (o podría volver a implementarla). Al observarlo, dotNeetPeek muestra que no solo tiene en cuenta mayúsculas y minúsculas, sino también el tipo kana y los caracteres de ancho completo y medio (principalmente relevantes para los idiomas asiáticos, aunque también hay versiones de ancho completo del alfabeto romano) ) Me estoy saltando algunos detalles, pero mira el método privadoInternalInStrText
:fuente
Solo así:
fuente
Utilizar este:
fuente
Contains
noCompare
.Contains
conIndexOf
. ¡Entonces este enfoque es igualmente útil! El ejemplo de código C # en esta página está usando string.Compare (). Elección del equipo de SharePoint que es!Esto es bastante similar a otro ejemplo aquí, pero he decidido simplificar enum to bool, primario porque normalmente no se necesitan otras alternativas. Aquí está mi ejemplo:
Y el uso es algo como:
fuente
Usar un RegEx es una forma directa de hacer esto:
fuente
Solo para construir sobre la respuesta aquí, puede crear un método de extensión de cadena para que esto sea un poco más fácil de usar:
fuente
return CultureInfo.CurrentCulture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0;
en su lugar.si desea verificar si su cadena pasada está en cadena, entonces hay un método simple para eso.
Este valor booleano devolverá si la cadena está contenida o no
fuente
Tan simple y funciona
fuente
fuente
Puedes usar la
string.indexof ()
función. Esto será insensible a mayúsculas y minúsculasfuente
El truco aquí es buscar la cadena, ignorando el caso, pero mantenerla exactamente igual (con el mismo caso).
La salida es "Restablecer"
fuente
fuente
Manera simple para novato:
fuente