Domanda Case insensitive 'Contains (string)'


C'è un modo per rendere il seguente ritorno vero?

string title = "ASTRINGTOTEST";
title.Contains("string");

Non sembra esserci un sovraccarico che mi permetta di impostare la distinzione tra maiuscole e minuscole. Attualmente li faccio MAIUSCOLI entrambi, ma è solo sciocco (con cui mi riferisco al i18n problemi che si presentano con involucri alti e bassi).

AGGIORNARE
Questa domanda è antica e da allora mi sono reso conto che ho chiesto una risposta semplice per un argomento davvero vasto e difficile se ti interessa investigarlo completamente.
Per la maggior parte dei casi, in lingue mono-lingue, basi in inglese Questo la risposta sarà sufficiente Sospetto che la maggior parte della gente che viene qui cada in questa categoria è la risposta più popolare.
Questo la risposta, tuttavia, fa emergere il problema intrinseco che non possiamo confrontare il testo senza distinzione tra maiuscole e minuscole finché non sappiamo che entrambi i testi sono la stessa cultura e sappiamo che cos'è questa cultura. Questa è forse una risposta meno popolare, ma penso che sia più corretta ed è per questo che l'ho contrassegnata come tale.


2415
2018-01-14 21:39


origine


risposte:


Per verificare se la stringa paragraph contiene la stringa word (grazie @QuarterMeister)

culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0

Dove culture è l'istanza di CultureInfo descrivendo la lingua in cui è scritto il testo.

Questa soluzione è trasparente la definizione di insensibilità al caso, che dipende dalla lingua. Ad esempio, la lingua inglese utilizza i caratteri I e i per le versioni maiuscole e minuscole della nona lettera, mentre la lingua turca usa questi caratteri per il undicesima e dodicesima lettera del suo alfabeto di 29 lettere. La versione turca di "i" è il carattere non familiare "©".

Quindi le corde tin e TIN sono la stessa parola in inglese, ma parole diverse In turco. Come ho capito, uno significa "spirito" e l'altro è una parola onomatopeica. (Turchi, per favore correggimi se sbaglio o suggerisci un esempio migliore)

Per riassumere, puoi solo rispondere alla domanda 'sono queste due stringhe uguali ma in diversi casi' se sai in che lingua si trova il testo. Se non lo sai, dovrai prendere un punt. Data l'egemonia inglese nel software, dovresti probabilmente ricorrere a CultureInfo.InvariantCulture, perché sarà sbagliato in modi familiari.


1082
2018-03-17 18:22



Potresti usare il String.IndexOf Method e passare StringComparison.OrdinalIgnoreCase come il tipo di ricerca da usare:

string title = "STRING";
bool contains = title.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0;

Ancora meglio sta definendo un nuovo metodo di estensione per la stringa:

public static class StringExtensions
{
    public static bool Contains(this string source, string toCheck, StringComparison comp)
    {
        return source?.IndexOf(toCheck, comp) >= 0;
    }
}

Nota che propagazione null  ?. è disponibile da C # 6.0 (VS 2015), per le versioni precedenti

if (source == null) return false;
return source.IndexOf(toCheck, comp) >= 0;

USO:

string title = "STRING";
bool contains = title.Contains("string", StringComparison.OrdinalIgnoreCase);

2356
2018-01-14 21:44



Puoi usare IndexOf() come questo:

string title = "STRING";

if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
{
    // The string exists in the original
}

Poiché 0 (zero) può essere un indice, si controlla contro -1.

MSDN

La posizione dell'indice di valore a base zero se tale stringa viene trovata o -1   se non è. Se value è String.Empty, il valore restituito è 0.


203
2018-01-14 21:48



Soluzione alternativa con Regex:

bool contains = Regex.IsMatch("StRiNG to search", "string", RegexOptions.IgnoreCase);

Avviso

Come ha sottolineato @cHao nel suo commento, ci sono degli scenari che causeranno che questa soluzione restituisca risultati errati. Assicurati di sapere cosa stai facendo prima di implementare questa soluzione a caso.


115
2017-07-28 17:18



Puoi sempre alzare o abbassare le stringhe prima.

string title = "string":
title.ToUpper().Contains("STRING")  // returns true

Oops, ho appena visto quell'ultima parte. Un confronto senza distinzione tra maiuscole e minuscole sarebbe *probabilmente* fare lo stesso comunque, e se le prestazioni non sono un problema, non vedo un problema con la creazione di copie maiuscole e il confronto di quelle. Potrei giurare che una volta ho visto un confronto insensibile al caso ...


62
2018-01-14 21:42



Un problema con la risposta è che genererà un'eccezione se una stringa è nulla. Puoi aggiungerlo come assegno per non farlo:

public static bool Contains(this string source, string toCheck, StringComparison comp)
{
    if (string.IsNullOrEmpty(toCheck) || string.IsNullOrEmpty(source))
        return true;

    return source.IndexOf(toCheck, comp) >= 0;
} 

48
2017-12-07 21:11



La classe StringExtension è la soluzione da seguire, ho combinato un paio di post sopra per dare un esempio di codice completo:

public static class StringExtensions
{
    /// <summary>
    /// Allows case insensitive checks
    /// </summary>
    public static bool Contains(this string source, string toCheck, StringComparison comp)
    {
        return source.IndexOf(toCheck, comp) >= 0;
    }
}

32
2017-11-18 16:48



Questo è pulito e semplice.

Regex.IsMatch(file, fileNamestr, RegexOptions.IgnoreCase)

31
2017-11-09 04:25