3461 Stimmen

Groß-/Kleinschreibung unempfindlich 'Enthält(string)'

Gibt es eine Möglichkeit, den folgenden Wert auf true zu setzen?

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

Es scheint keine Funktion zu geben, mit der ich die Groß- und Kleinschreibung einstellen kann. Zurzeit schreibe ich beide mit GROSSSCHREIBUNG, aber das ist einfach dumm (womit ich mich auf die i18n Probleme, die mit der Verkleidung nach oben und unten verbunden sind).

UPDATE

Diese Frage ist uralt, und inzwischen ist mir klar geworden, dass ich um eine einfache Antwort auf ein wirklich umfangreiches und schwieriges Thema gebeten habe, wenn man sich eingehend damit befassen möchte.

Für die meisten Fälle, in einsprachigen, englischen Codebasen este Antwort wird ausreichen. Ich vermute, weil die meisten Menschen, die hierher kommen, in diese Kategorie fallen, ist dies die beliebteste Antwort.

Diese Antwort wirft jedoch das inhärente Problem auf, dass wir Texte nicht ohne Berücksichtigung der Groß- und Kleinschreibung vergleichen können, solange wir nicht wissen, dass beide Texte aus der gleichen Kultur stammen und wir wissen, was diese Kultur ist. Dies ist vielleicht eine weniger populäre Antwort, aber ich denke, sie ist richtiger und deshalb habe ich sie als solche markiert.

1 Stimmen

Versuchen Sie dies: Yourculture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0

3155voto

JaredPar Punkte 699699

Sie könnten die String.IndexOf Methode und passieren StringComparison.OrdinalIgnoreCase als die zu verwendende Art der Suche:

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

Noch besser ist die Definition einer neuen Erweiterungsmethode für string:

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

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

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

ANWENDUNG:

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

1 Stimmen

Wo wäre der beste Ort, um so etwas innerhalb einer App-Struktur zu platzieren?

1 Stimmen

@Andi, ich habe in der Regel ein paar Codedateien mit allgemeinen Erweiterungsmethoden, in denen dies geschehen würde.

0 Stimmen

@JaredPar: Ich bin neugierig zu wissen, ob .Net 4 oder .Net 4.5 dies eingebaut hat, wissen Sie das?

1583voto

Colonel Panic Punkte 125419

Um zu prüfen, ob die Zeichenkette paragraph enthält die Zeichenfolge word (danke @QuarterMeister)

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

Wo culture ist die Instanz von CultureInfo die Beschreibung der Sprache, in der der Text verfasst ist.

Diese Lösung ist transparent über die Definition der Groß- und Kleinschreibung, die sprachabhängig ist . Die englische Sprache verwendet zum Beispiel die Zeichen I y i für die Groß- und Kleinschreibung des neunten Buchstabens, während die türkische Sprache diese Zeichen für die elfter und zwölfter Buchstabe des 29 Buchstaben langen Alphabets. Die türkische Großbuchstabenversion von "i" ist das unbekannte Zeichen "I".

So werden die Saiten tin y TIN sind das gleiche Wort auf Englisch , aber andere Worte auf Türkisch . So wie ich das verstehe, bedeutet das eine "Geist" und das andere ist ein lautmalerisches Wort. (Türken, bitte korrigiert mich, wenn ich falsch liege, oder schlagt ein besseres Beispiel vor)

Zusammenfassend kann man nur die Frage beantworten: "Sind diese beiden Strings gleich, aber in unterschiedlichen Fällen? wenn Sie wissen, in welcher Sprache der Text verfasst ist . Wenn Sie es nicht wissen, müssen Sie einen Versuch wagen. Angesichts der Vorherrschaft des Englischen in der Softwarebranche sollten Sie wahrscheinlich auf CultureInfo.InvariantCulture denn sie wird in gewohnter Weise falsch sein.

0 Stimmen

Ich verstehe, was Sie meinen, und Sie haben wahrscheinlich Recht. Diese Frage ist uralt und ich muss sie noch einmal durchlesen, aber ich denke, ich werde die akzeptierte Antwort ändern.

79 Stimmen

Warum nicht culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0 ? Das verwendet die richtige Kultur und ist case-insensitive, es nicht zuweisen temporäre Kleinschreibung Zeichenfolgen, und es vermeidet die Frage, ob die Umwandlung in Kleinbuchstaben und Vergleich ist immer das gleiche wie ein case-insensitive Vergleich.

0 Stimmen

@Quartiermeister das wird funktionieren. Ich habe versucht, herauszufinden, wie CompareInfo.IndexOf definiert den Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung, aber die Methode umhüllt einfach InternalFindNLSStringEx die nicht dokumentiert ist.

279voto

mkchandler Punkte 4418

Sie können verwenden IndexOf() wie diese:

string title = "STRING";

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

Da 0 (Null) ein Index sein kann, wird gegen -1 geprüft.

MSDN

Die auf Null basierende Indexposition von value, wenn diese Zeichenkette gefunden wird, oder -1 wenn sie nicht gefunden wird. Wenn value String.Empty ist, ist der Rückgabewert 0.

217voto

Mathieu Renda Punkte 11508

.NET Core 2.0+ (einschließlich .NET 5.0+)

.NET Core verfügt seit Version 2.0 über ein Paar Methoden, um dies zu bewältigen:

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

Beispiel:

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

Sie ist jetzt offiziell Teil des .NET-Standards 2.1 und daher Teil aller Implementierungen der Basisklassenbibliothek, die diese Version des Standards (oder eine höhere) implementieren.

5 Stimmen

Jetzt auch erhältlich in .NET Standard 2.1

1 Stimmen

Verfügbar in .NET 5.0 auch.

6 Stimmen

.NET 5.0 ist in ".NET Core 2.0+" enthalten.

161voto

Jed Punkte 10149

Alternative Lösung mit Regex:

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

7 Stimmen

Gute Idee, auch wir haben eine Menge bitweiser Kombinationen in RegexOptions wie RegexOptions.IgnoreCase & RegexOptions.IgnorePatternWhitespace & RegexOptions.CultureInvariant; für jeden, der helfen kann.

8 Stimmen

Ich muss sagen, dass ich diese Methode bevorzuge, obwohl ich IsMatch aus Gründen der Übersichtlichkeit verwende.

38 Stimmen

Schlimmer noch: Da die Suchzeichenfolge als Regex interpretiert wird, führen mehrere Satzzeichen zu falschen Ergebnissen (oder lösen eine Ausnahme aufgrund eines ungültigen Ausdrucks aus). Versuchen Sie die Suche nach "." sur "This is a sample string that doesn't contain the search string" . Oder versuchen Sie die Suche nach "(invalid" und so weiter.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X