c# equals string - Groß- und Kleinschreibung nicht berücksichtigt 'Enthält (Zeichenfolge)'




12 Answers

Um zu testen, ob der String- paragraph das String- word enthält (danke @QuarterMeister)

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

Dabei ist culture die Instanz von CultureInfo , die die Sprache beschreibt, in der der Text geschrieben ist.

Diese Lösung ist transparent bezüglich der Definition der Unterscheidung zwischen Groß- und Kleinschreibung, die sprachabhängig ist . Beispielsweise verwendet die englische Sprache die Zeichen I und i für die Groß- und Kleinschreibung des neunten Buchstabens, während die türkische Sprache diese Zeichen für den elften und zwölften Buchstaben des 29-stelligen Alphabets verwendet. Die türkische Großbuchstabe von 'i' ist der unbekannte Buchstabe 'İ'.

Daher sind die Zeichenfolgen tin und TIN auf Englisch dasselbe Wort, auf Türkisch jedoch unterschiedliche Wörter. Wie ich es verstehe, bedeutet einer "Geist" und der andere ist ein Wort der Onomatopoeie. (Türken, bitte korrigieren Sie mich, wenn ich falsch liege, oder schlagen Sie ein besseres Beispiel vor)

Zusammenfassend lässt sich sagen , dass Sie nur die Frage beantworten können, "sind diese beiden Zeichenfolgen gleich, aber in verschiedenen Fällen", wenn Sie wissen, in welcher Sprache der Text vorliegt . Wenn Sie es nicht wissen, müssen Sie einen Kahn nehmen. Angesichts der Hegemonie von Englisch in Software sollten Sie wahrscheinlich auf CultureInfo.InvariantCulture , da dies auf bekannte Weise falsch ist.

comparison compare

Gibt es eine Möglichkeit, die folgenden Ergebnisse wahr zu machen?

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

Es scheint keine Überlastung zu geben, die es mir erlaubt, die Groß- / Kleinschreibung einzustellen. Momentan ÜBERZEUGE ich beide, aber das ist blöd (womit ich mich auf die i18n Probleme beziehe, die mit Up- und Down-Casing einhergehen).

AKTUALISIEREN
Diese Frage ist uralt und seitdem ist mir klar, dass ich um eine einfache Antwort auf ein wirklich umfangreiches und schwieriges Thema gebeten habe, wenn Sie es gründlich untersuchen wollen.
In den meisten Fällen reicht this Antwort bei einsprachigen englischen Codebasen aus. Ich vermute, da die meisten Leute, die hierher kommen, in diese Kategorie fallen, ist dies die beliebteste Antwort.
This Antwort wirft jedoch das inhärente Problem auf, dass wir nicht zwischen Groß- und Kleinschreibung unterscheiden können, bis wir wissen, dass beide Texte dieselbe Kultur sind und wir wissen, was diese Kultur ist. Dies ist vielleicht eine weniger beliebte Antwort, aber ich denke, es ist richtiger und deshalb habe ich sie als solche markiert.




Sie können IndexOf() :

string title = "STRING";

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

Da 0 (Null) ein Index sein kann, prüfen Sie gegen -1.

MSDN

Die auf Null basierende Indexposition des Werts, wenn diese Zeichenfolge gefunden wird, oder -1, wenn dies nicht der Fall ist. Wenn der Wert String.Empty ist, ist der Rückgabewert 0.




Sie können die Saiten immer zuerst auf- oder abwandern.

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

Hoppla, ich habe gerade das letzte Stück gesehen. Ein Vergleich ohne Unterscheidung zwischen Groß- und Kleinschreibung würde * wahrscheinlich * das gleiche ohnehin tun, und wenn Leistung kein Problem ist, sehe ich kein Problem, wenn Sie Großbuchstaben erstellen und diese vergleichen. Ich hätte schwören können, dass ich einmal einen Vergleich zwischen Groß- und Kleinschreibung gesehen habe ...




Die StringExtension-Klasse ist der Weg nach vorne. Ich habe ein paar der obigen Beiträge kombiniert, um ein vollständiges Codebeispiel zu geben:

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;
    }
}



OrdinalIgnoreCase, CurrentCultureIgnoreCase oder InvariantCultureIgnoreCase?

Da dies fehlt, hier einige Empfehlungen, wann welche verwendet werden sollte:

DOS

  • Verwenden Sie StringComparison.OrdinalIgnoreCase für Vergleiche als sicheren Standard für das StringComparison.OrdinalIgnoreCase von Zeichenfolgen mit Kultur-Agnostik.
  • Verwenden Sie StringComparison.OrdinalIgnoreCase Vergleiche, um die Geschwindigkeit zu erhöhen.
  • Verwenden Sie StringComparison.CurrentCulture-based Zeichenfolgenoperationen, wenn Sie dem Benutzer die Ausgabe anzeigen.
  • Wechseln Sie die aktuelle Verwendung von Zeichenfolgenoperationen basierend auf der invarianten Kultur, um das nichtsprachliche StringComparison.Ordinal oder StringComparison.OrdinalIgnoreCase wenn der Vergleich erfolgt
    sprachlich irrelevant (zum Beispiel symbolisch).
  • Verwenden Sie ToUpperInvariant anstelle von ToLowerInvariant wenn Sie Strings für den Vergleich normalisieren.

Don'ts

  • Verwenden Sie Überladungen für Stringoperationen, bei denen der Stringvergleichsmechanismus nicht explizit oder implizit angegeben wird.
  • Verwenden Sie StringComparison.InvariantCulture basierte Zeichenfolge
    Operationen in den meisten Fällen; Eine der wenigen Ausnahmen wäre
    persistente sprachlich bedeutsame aber kulturell agnostische Daten.

Basierend auf diesen Regeln sollten Sie Folgendes verwenden:

string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.[YourDecision]) != -1)
{
    // The string exists in the original
}

[YourDecision] hängt von den Empfehlungen von oben ab.

Link zur Quelle: http://msdn.microsoft.com/en-us/library/ms973919.aspx




Die InStr Methode aus der VisualBasic-Assembly ist am besten InStr , wenn Sie Bedenken hinsichtlich der Internationalisierung haben (oder sie möglicherweise erneut implementieren). DotNeetPeek zeigt darin, dass nicht nur Groß- und Kleinbuchstaben berücksichtigt werden, sondern auch Kana-Zeichen und Voll- / Halb-Zeichen (meistens für asiatische Sprachen relevant), obwohl auch das lateinische Alphabet in voller Breite verfügbar ist ). Ich überspringe einige Details, aber checke die private Methode InternalInStrText :

private static int InternalInStrText(int lStartPos, string sSrc, string sFind)
{
  int num = sSrc == null ? 0 : sSrc.Length;
  if (lStartPos > num || num == 0)
    return -1;
  if (sFind == null || sFind.Length == 0)
    return lStartPos;
  else
    return Utils.GetCultureInfo().CompareInfo.IndexOf(sSrc, sFind, lStartPos, CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth);
}



Benutze das:

string.Compare("string", "STRING", new System.Globalization.CultureInfo("en-US"), System.Globalization.CompareOptions.IgnoreCase);



Die Verwendung eines RegEx ist ein direkter Weg, dies zu tun:

Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);



Dies sind die einfachsten Lösungen.

  1. Nach Index von

    string title = "STRING";
    
    if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
    {
        // contains 
    }
    
  2. Durch Ändern von Groß- und Kleinschreibung

    string title = "STRING";
    
    bool contains = title.ToLower().Contains("string")
    
  3. Von Regex

    Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);
    



Sie können die Funktion string.indexof () verwenden. Dies wird unabhängig von der Schreibweise sein




Nur .NET Core 2.0+ (ab sofort)

.NET Core verfügt seit Version 2.0 über zwei Methoden, um damit umzugehen:

  • String.Contains (Char, StringComparison )
  • String.Contains (String, StringComparison )

Beispiel:

"Test".Contains("test", System.StringComparison.CurrentCultureIgnoreCase);

Mit der Zeit werden sie wahrscheinlich in den .NET-Standard und von dort in alle anderen Implementierungen der Basisklassenbibliothek gelangen.




Wenn Sie überprüfen möchten, ob Ihre übergebene Zeichenfolge eine Zeichenfolge ist, gibt es dafür eine einfache Methode.

string yourStringForCheck= "abc";
string stringInWhichWeCheck= "Test abc abc";

bool isContaines = stringInWhichWeCheck.ToLower().IndexOf(yourStringForCheck.ToLower()) > -1;

This boolean value will return if string contains or not



Related