Frage Groß- / Kleinschreibung beachten "Enthält (Zeichenfolge)"


Gibt es eine Möglichkeit, die folgende Rückkehr wahr zu machen?

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

Es scheint keine Überlastung zu geben, die es mir erlaubt, die Groß- / Kleinschreibung festzulegen. Zurzeit vereinheitliche ich sie beide, aber das ist nur albern (womit ich mich auf die i18n Probleme, die mit Up- und Down-Gehäuse kommen).

AKTUALISIEREN
Diese Frage ist alt und seitdem habe ich erkannt, dass ich um eine einfache Antwort für ein wirklich großes und schwieriges Thema gebeten habe, wenn Sie es gründlich untersuchen wollen.
In den meisten Fällen in einsprachigen, englischen Codebasen Dies Antwort wird ausreichen. Ich vermute, weil die meisten Leute, die hierher kommen, in diese Kategorie fallen, ist dies die beliebteste Antwort.
Dies Die Antwort bringt jedoch das inhärente Problem auf, dass wir Text nicht in Groß- und Kleinschreibung vergleichen können, bis wir beide Texte als dieselbe Kultur kennen und wir wissen, was diese Kultur ist. Dies ist vielleicht eine weniger populäre Antwort, aber ich denke, es ist korrekter und deshalb habe ich es als solches markiert.


2416
2018-01-14 21:39


Ursprung


Antworten:


Um zu testen, ob die Zeichenfolge paragraph enthält die Zeichenfolge word (Danke @QuarterMeister)

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

Woher culture ist die Instanz von CultureInfo Beschreibung der Sprache, in der der Text geschrieben ist.

Diese Lösung ist transparent über die Definition von case-insensitivity, die sprachabhängig ist. Zum Beispiel verwendet die englische Sprache die Zeichen I und i für die Groß - und Kleinschreibung des neunten Buchstaben, während die türkische Sprache diese Zeichen für die elfter und zwölfter Buchstabe von seinem 29 Buchstaben langen Alphabet. Die türkische Großbuchstabe von 'i' ist das unbekannte Zeichen ''.

Also die Saiten tin und TIN sind das gleiche Wort auf Englisch, aber andere Wörter auf Türkisch. Wie ich verstehe, bedeutet man "Geist" und der andere ist ein Onomatopoeia-Wort. (Türken, bitte korrigiere mich, wenn ich falsch liege, oder schlage ein besseres Beispiel vor)

Zusammenfassend kann man nur die Frage beantworten: Sind diese beiden Strings gleich, aber in verschiedenen Fällen? wenn Sie wissen, in welcher Sprache sich der Text befindet. Wenn Sie nicht wissen, müssen Sie einen Punt nehmen. Angesichts der Vormachtstellung des Engländers in der Software sollten Sie wahrscheinlich darauf zurückgreifen CultureInfo.InvariantCultureweil es auf gewohnte Weise falsch sein wird.


1083
2018-03-17 18:22



Du könntest das benutzen String.IndexOf Methode und passiere StringComparison.OrdinalIgnoreCase als die Art der zu verwendenden Suche:

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

Noch besser ist es, eine neue Erweiterungsmethode für string zu definieren:

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

Beachten Sie, dass Nullfortpflanzung  ?. ist seit C # 6.0 (VS 2015) für ältere Versionen verfügbar

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

VERWENDUNG:

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

2356
2018-01-14 21:44



Sie können verwenden IndexOf() so was:

string title = "STRING";

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

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

MSDN

Die nullbasierte Indexposition des Werts, wenn diese Zeichenfolge gefunden wird, oder -1   wenn es das nicht ist. Wenn der Wert String.Empty ist, ist der Rückgabewert 0.


203
2018-01-14 21:48



Alternative Lösung mit Regex:

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

Beachten

Wie @cHao in seinem Kommentar darauf hingewiesen hat, gibt es Szenarien, die dazu führen, dass diese Lösung falsche Ergebnisse liefert. Stellen Sie sicher, dass Sie wissen, was Sie tun, bevor Sie diese Lösung planlos implementieren.


115
2017-07-28 17:18



Sie könnten die Saiten immer zuerst hoch- oder runterklappen.

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

Hoppla, habe gerade das letzte Stück gesehen. Ein case insensitive vergleichen würde *wahrscheinlich* Machen Sie trotzdem dasselbe, und wenn die Leistung kein Problem darstellt, sehe ich kein Problem beim Erstellen von Großkopien und Vergleichen dieser. Ich hätte schwören können, dass ich einmal eine case-insensitive vergleichen einmal gesehen habe ...


62
2018-01-14 21:42



Ein Problem mit der Antwort ist, dass eine Ausnahme ausgelöst wird, wenn eine Zeichenfolge null ist. Sie können das als Kontrolle hinzufügen, damit es nicht funktioniert:

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



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

32
2017-11-18 16:48



Das ist sauber und einfach.

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

31
2017-11-09 04:25



OrdinalIgnoreCase, CurrentCultureIgnoreCase oder InvariantCultureIgnoreCase?

Da dies fehlt, sind hier einige Empfehlungen, wann Sie welche verwenden sollten:

DOS

  • Benutzen StringComparison.OrdinalIgnoreCase für Vergleiche als sicherer Standard für den kulturunabhängigen String-Abgleich.
  • Benutzen StringComparison.OrdinalIgnoreCase Vergleiche für erhöhte Geschwindigkeit.
  • Benutzen StringComparison.CurrentCulture-based String-Operationen wenn die Ausgabe für den Benutzer angezeigt wird.
  • Wechseln Sie die aktuelle Verwendung von Zeichenfolgenoperationen basierend auf der Invariante Kultur, um das nicht-linguistische zu verwenden StringComparison.Ordinal oder StringComparison.OrdinalIgnoreCase wenn der Vergleich ist
    sprachlich irrelevant (symbolisch zum Beispiel).
  • Benutzen ToUpperInvariant eher, als ToLowerInvariant wann Normalisieren von Zeichenfolgen zum Vergleich.

Don'ts

  • Verwenden Sie Überladungen für nicht explizit angegebene Zeichenfolgenoperationen oder implizit den String-Vergleichsmechanismus angeben.
  • Benutzen StringComparison.InvariantCulture -basierte Zeichenfolge
    Operationen in den meisten Fällen; eine der wenigen Ausnahmen wäre
    persistente sprachlich sinnvolle, aber kulturunabhängige 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
}

während [YourDecision] von den Empfehlungen von oben abhängt.

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


24
2018-06-17 10:31



Genau wie dieser:

string s="AbcdEf";
if(s.ToLower().Contains("def"))
{
    Console.WriteLine("yes");
}

12
2017-07-13 09:54