Groß-und Kleinschreibung 'Enthält(string)'
Gibt es eine Möglichkeit, um die folgenden return true?
string title = "ASTRINGTOTEST";
title.Contains("string");
Scheint es nicht zu einer überlastung, die mir erlaubt, um die groß-und Kleinschreibung.. Momentan habe ich GROßBUCHSTABEN mit Ihnen beiden, aber das ist einfach nur albern (ich beziehe mich auf den i18n Probleme, die sich mit up - und down-Gehäuse).
UPDATE
Diese Frage ist uralt und da habe ich dann erkannte, dass ich fragte, für eine einfache Antwort für eine wirklich große und schwierige Thema, wenn Sie Sorgfalt zu untersuchen, ist es voll.
Für die meisten Fälle, die in mono-lingual Englisch code-Basen diese Antwort genügt. Ich bin zu Ahnen, da die meisten Besucher hier, die in diese Kategorie fallen dies ist die beliebteste Antwort.
Diese Antwort jedoch bringt das inhärente problem, dass wir nicht vergleichen können text mit groß-und Kleinschreibung, bis wir wissen beide Texte die gleiche Kultur und wir wissen, was Kultur ist. Dies ist vielleicht eine weniger populäre Antwort, aber ich denke, es ist richtiger, und das ist, warum ich markiert Sie als solche.
InformationsquelleAutor Boris Callens | 2009-01-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Um zu testen, ob der string
paragraph
enthält den stringword
(danke @QuarterMeister)Wo
culture
ist die Instanz vonCultureInfo
beschreibt die Sprache, die der text geschrieben ist.Diese Lösung ist transparent über der definition der Fall-Gefühllosigkeit, die von der Sprache abhängigen. Beispielsweise wird die englische Sprache verwendet die Zeichen
I
undi
für die Obere und Kleinbuchstaben-Versionen der neunten Brief, in der Erwägung, dass die türkische Sprache verwendet, diese Zeichen für die elften und zwölften Buchstaben von den 29 Buchstaben langen alphabet. Der türkische groß-version von 'ich' ist das unbekannte Zeichen 'I'.Damit die Saiten
tin
undTIN
sind das gleiche Wort in Englisch, aber verschiedene Wörter in der türkischen. So wie ich das verstehe, bedeutet "Geist" und die andere ist eine Lautmalerei Wort. (Türken, bitte korrigieren Sie mich, wenn ich falsch bin, oder schlagen Sie ein besseres Beispiel)Zusammenzufassen, können Sie nur die Frage beantworten: "sind diese beiden strings die gleichen, aber in verschiedenen Fällen' wenn Sie wissen, welche Sprache der text ist in. Wenn Sie nicht wissen, müssen Sie nehmen einen punt. Angesichts englische Hegemonie in der software, sollten Sie wahrscheinlich resort zu
CultureInfo.InvariantCulture
, denn es wäre falsch, in der gewohnten Weise.culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0
? Verwendet die richtige Kultur und die groß- / Kleinschreibung nicht beachtet, ist es nicht zuordnen temporäre strings in Kleinbuchstaben, und es vermeidet die Frage, ob die Konvertierung in Kleinbuchstaben und vergleichen ist immer das gleiche, wie eine groß- / Kleinschreibung-Vergleich.Auch diese Lösung unnötig belastet wird der heap durch die Zuweisung von Speicher für das, was sollte eine Suche-Funktion
Im Vergleich mit ToLower() geben unterschiedliche Ergebnisse aus einer groß- / Kleinschreibung IndexOf wenn zwei verschiedene Buchstaben haben die gleiche Kleinbuchstaben. Zum Beispiel, ruft ToLower() auf U+0398 "Greek Capital Letter Theta" oder U+03F4 "griechischer Großbuchstabe Theta-Symbol" Ergebnisse in U+03B8, "Griechische Kleine Buchstaben Theta", aber die Großbuchstaben sind als andere. Beide Lösungen prüfen, Kleinbuchstaben mit dem gleichen Buchstaben groß anders, wie U+0073 "Latin Small Letter S" und U+017F Latin Small Letter Long S", so die IndexOf-Lösung scheint mehr im Einklang.
+1 auf Vollständigkeit - Antworten mit der richtigen form der Erklärung die einzige Möglichkeit, die Benutzer tatsächlich lernen, die von SO
Warum hast du nicht schreiben "ddddfg".IndexOf("Df", StringComparison.OrdinalIgnoreCase) ?
InformationsquelleAutor Colonel Panic
Könnten Sie die String.IndexOf-Methode und pass
StringComparison.OrdinalIgnoreCase
wie die Art der Suche zu verwenden:Sogar noch besser ist die Definition einer neuen Erweiterung-Methode für string:
Beachten Sie, dass null-Vermehrung
?.
verfügbar ist, da C# 6.0 (VS 2015), für ältere Versionen verwenden SieVERWENDUNG:
Dies gibt die gleiche Antwort wie
paragraph.ToLower(culture).Contains(word.ToLower(culture))
mitCultureInfo.InvariantCulture
und löst es nicht jede Lokalisierung Probleme. Warum über die Dinge zu komplizieren? stackoverflow.com/a/15464440/284795die
ToLower
version enthält 2-Zuweisungen, die unnötig sind, die in einem Vergleichs - / search-operation. Warum unnötig reservieren, in einem Szenario, das nicht erforderlich ist es?das wird nicht funktionieren, weil
string
ist einIEnumerable<char>
daher können Sie es nicht verwenden, um Teilstrings zu suchenEin Wort der Warnung: Der Standardwert für
string.IndexOf(string)
ist die Verwendung der aktuellen Kultur, während die Standardeinstellung fürstring.Contains(string)
ist die Verwendung der Ordnungszahl comparer. Wie wir wissen, der ehemalige verändert werden kann Kommissionierung eine längere überlastung, während die letzteren kann nicht geändert werden. Eine Konsequenz dieser Ungereimtheit ist dem folgenden code-Beispiel: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 */
InformationsquelleAutor JaredPar
Können Sie
IndexOf()
wie diese:Seit 0 (null) kann eine index check gegen -1.
MSDN
InformationsquelleAutor mkchandler
Alternative Lösung mit Regex:
RegexOptions.IgnoreCase & RegexOptions.IgnorePatternWhitespace & RegexOptions.CultureInvariant;
für alle, wenn hilft.Muss sagen, ich bevorzuge diese Methode, obwohl mit IsMatch für Sauberkeit.
Was ist schlimmer, da der Suchbegriff wird als regulärer Ausdruck, eine Anzahl von Satzzeichen chars wird zu falschen Ergebnissen führen (oder das auslösen einer exception wegen eines ungültigen Ausdrucks). Versuchen Sie eine Suche für
"."
im"This is a sample string that doesn't contain the search string"
. Oder versuchen Sie die Suche nach"(invalid"
, für diese Angelegenheit.In diesem Fall
Regex.Escape
helfen könnte. Regex scheint immer noch unnötig, wennIndexOf
/ ErweiterungContains
ist einfach (und wohl auch klarer).Beachten Sie, dass ich war nicht der Annahme, dass dieses Regex-Lösung war der beste Weg zu gehen. Ich war einfach das hinzufügen zu die Liste von Antworten auf die ursprüngliche gepostete Frage "gibt es einen Weg, um die folgenden return true?".
InformationsquelleAutor Jed
Konnte man immer nur oben oder downcase die Saiten zuerst.
Oops, gerade gesehen, dass das Letzte bisschen. Eine groß-und Kleinschreibung vergleichen würde
*
wahrscheinlich*
tun ja eh der gleiche, und wenn die Leistung nicht ein Problem ist, sehe ich nicht ein problem mit der Erstellung Großbuchstaben Kopien und vergleicht diese. Ich könnte schwören, dass ich einmal sah eine case-insensitive vergleichen Sie einmal...Suche nach "Turkey test" 🙂
In einigen französischen Gebietsschemas, die Großbuchstaben haben nicht die diakritischen Zeichen, so ToUpper() kann nicht besser sein als ToLower(). Ich würde sagen, verwenden der richtigen Werkzeuge, wenn Sie verfügbar sind - groß- / Kleinschreibung zu vergleichen.
Nicht verwenden, ToUpper oder ToLower, und tun, was Jon Skeet, sagte
Gerade gesehen, das nach zwei Jahren wieder und einen neuen downvote... eh, ich bin damit einverstanden, dass es bessere Möglichkeiten zum vergleichen von strings. Jedoch nicht alle Programme lokalisiert werden (die meisten nicht) und viele interne oder Wegwerf-apps. Da kann ich kaum erwarten, einen Kredit für die Beratung am besten Links für Wegwerf-apps... ich bin bewegt auf 😀
InformationsquelleAutor Ed S.
Einem Problem mit der Antwort ist, dass es wird eine Ausnahme geworfen, wenn ein string null ist. Sie können hinzufügen, dass so ein check, damit es nicht:
Basierend auf amurra ' s Kommentar oben, nicht den vorgeschlagenen code korrigiert werden müssen? Und sollte dies nicht Hinzugefügt werden, um die akzeptierten Antworten, so dass die beste Antwort ist die erste?
Nun diese gibt true zurück, wenn source ein leerer string oder null ist, egal was toCheck ist. Das kann nicht richtig sein. Auch IndexOf schon gibt true zurück, wenn toCheck einen leeren string und die Quelle ist nicht null. Was benötigt wird, ist eine überprüfung auf null. Ich schlage vor, wenn (source == null || Wert == null) return false;
Die Quelle kippe null
if (string.IsNullOrEmpty(source)) return string.IsNullOrEmpty(toCheck);
InformationsquelleAutor FeiBao 飞豹
StringExtension-Klasse ist der Weg, den ich zusammengefügt habe ein paar der Beiträge vor, um ein komplettes code-Beispiel:
InformationsquelleAutor Andrew
Dies ist einfach und sauber.
fileNamestr
hat eine spezielle regex-Zeichen (z.B.*
,+
,.
usw.) dann werden Sie in für die überraschung groß. Der einzige Weg, um diese Lösung funktioniert wie eine richtigeContains
Funktion ist, zu entkommenfileNamestr
by doingRegex.Escape(fileNamestr)
.InformationsquelleAutor takirala
OrdinalIgnoreCase, CurrentCultureIgnoreCase oder InvariantCultureIgnoreCase?
Da dieser fehlt, hier sind einige Empfehlungen dazu, Wann welche:
Dos
StringComparison.OrdinalIgnoreCase
für Vergleichewie Ihr sicher Standard für Kultur-Agnostiker string matching.
StringComparison.OrdinalIgnoreCase
Vergleichefür erhöhte Geschwindigkeit.
StringComparison.CurrentCulture-based
string-Operationenbei der Anzeige der Ausgabe an die Benutzer.
Kultur um die nicht-sprachlichen
StringComparison.Ordinal
oderStringComparison.OrdinalIgnoreCase
wenn der Vergleichsprachlich irrelevant (symbolisch, zum Beispiel).
ToUpperInvariant
eher alsToLowerInvariant
wenndie Normalisierung der strings für den Vergleich.
Don ' TS
oder implizit geben Sie die Zeichenfolge Vergleich-Mechanismus.
StringComparison.InvariantCulture
-basierten stringOperationen in den meisten Fällen; eine der wenigen Ausnahmen wäre
anhaltende sprachlich sinnvolle, aber kulturell-agnostische Daten.
Basierend auf diesen Regeln, die Sie verwenden sollten:
in der Erwägung, dass [YourDecision] hängt die Empfehlungen von oben.
link der Quelle: http://msdn.microsoft.com/en-us/library/ms973919.aspx
Ich würde verwenden OrdinalIgnoreCase, wenn Fall keine Rolle
InformationsquelleAutor Fabian Bigler
.NET Core 2.0+ nur (wie jetzt)
.NET Core hat ein paar Methoden im Umgang mit diesem seit version 2.0 :
Beispiel:
In der Zeit, werden Sie wahrscheinlich Ihren Weg in die .NET Standard und von dort aus in alle anderen Implementierungen der Base Class Library.
InformationsquelleAutor Mathieu Renda
Diese sind die einfachsten Lösungen.
Durch Index
Durch Ändern Fall
Durch Regex
InformationsquelleAutor LAV VISHWAKARMA
Ich weiß, dass das nicht C#, aber im Rahmen (VB.NET) es ist schon so eine Funktion
C# - Variante:
InformationsquelleAutor serhio
Den
InStr
Methode aus der VisualBasic-assembly ist das beste, wenn Sie ein Anliegen haben, über Internationalisierung (oder man könnte implementieren). Suche bei in es dotNeetPeek zeigt, dass es nicht nur Konto für Großbuchstaben und Kleinbuchstaben, aber auch für kana-Typ und voll - vs. Zeichen in halber Breite (relevant für die asiatischen Sprachen, obwohl es die volle Breite Versionen des lateinischen Alphabets). Ich überspringe über einige details, aber schauen Sie sich die private MethodeInternalInStrText
:InformationsquelleAutor Casey
Nur so:
Warum vermeiden string.ToLower (), wenn dabei groß-und Kleinschreibung string-Vergleich? Tl;Dr Es ist teuer, weil eine neue Zeichenfolge "hergestellt".
InformationsquelleAutor cdytoby
Verwenden:
Contains
nichtCompare
.die akzeptierte Antwort ist die Umsetzung
Contains
mitIndexOf
. Dieser Ansatz ist ebenso hilfreich! Der C# - code-Beispiel auf dieser Seite ist mit string.Vergleichen(). SharePoint-team-Wahl ist!InformationsquelleAutor mr.martan
Mithilfe von RegEx ist ein gerader Weg, dies zu tun:
Dies ist ein straight-up-Kopie von Antwort, und Sie leidet unter den gleichen Problemen wie bereits in der Antwort, dass
Downvote für den gleichen Grund @Liam gab
Vereinbart. Studie reguläre Ausdrücke
InformationsquelleAutor Stend
Dies ist sehr ähnlich wie das andere Beispiel hier, aber ich habe beschlossen, zu vereinfachen, enum, bool, PV, weil die anderen alternativen sind in der Regel nicht erforderlich. Hier ist mein Beispiel:
Und Nutzung ist so etwas wie:
InformationsquelleAutor TarmoPikaro
InformationsquelleAutor Tamilselvan K
Können Sie
string.indexof ()
Funktion. Dieser wird groß-und KleinschreibungInformationsquelleAutor Okan SARICA
Der trick hier ist, suchen Sie nach der Zeichenfolge, ignorieren Fall, aber um es genau das gleiche (mit den gleichen Fall).
Ausgang "Reset"
InformationsquelleAutor Mr.B
InformationsquelleAutor Final Heaven
wenn Sie möchten, um zu überprüfen, ob Ihr übergebene string wird in den string dann gibt es eine einfache Methode.
InformationsquelleAutor shaishav shukla
Nur zu bauen auf die Antwort hier, Sie können erstellen Sie einen string-extension-Methode machen dies zu einem littler benutzerfreundlich:
InformationsquelleAutor Melbourne Developer
ein Einfacher Weg für Anfänger:
Downvote, nur weil falsch. Was ist, wenn Titel = StRiNg? StRiNg != string und string != STRING
Ich war falsch. Bearbeiten, beantworten Sie wie folgt vor, zu simpel, einfach:<br/>Titel.ToLower().Contains("string") // natürlich "string" ist in Kleinbuchstaben
InformationsquelleAutor O Thạnh Ldt