Groß-und Kleinschreibung std::string.finden()
Ich bin mit std::string
's find()
Methode um zu testen, ob ein string a substring eines anderen. Jetzt muss ich groß-und Kleinschreibung version der gleichen Sache. Für string-Vergleich kann ich mich immer wenden stricmp()
aber es scheint nicht zu einem stristr()
.
Ich gefunden haben, verschiedene Antworten und die meisten empfehlen die Verwendung Boost
das ist nicht eine option in meinem Fall. Zusätzlich muss ich noch Unterstützung std::wstring
/wchar_t
. Irgendwelche Ideen?
Es gibt eine Gotw zu diesem Thema : gotw.ca/gotw/029.htm
stristr ist es zwar nicht, aber "char *strcasestr(const char *haystack, const char *needle);" ist da. Nicht ok?
stristr ist es zwar nicht, aber "char *strcasestr(const char *haystack, const char *needle);" ist da. Nicht ok?
strcasestr
ist nicht verfügbar unter Windows.InformationsquelleAutor wpfwannabe | 2010-06-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie
std::search
mit ein benutzerdefiniertes Prädikat.Aktualisiert mit C++ - version.
Perfekt! Weg zu gehen!
Hervorragende Lösung
Warum verwenden Sie Vorlagen hier?
InformationsquelleAutor Kirill V. Lyadvinsky
Den neuen C++11 style:
Erklärung der std::search finden Sie auf cplusplus.com.
c
in einem stringstr
mit der gleichen Funktion. Aufruf mitfindStringIC(str, (string)c)
funktioniert nichtDiese Art von char zu string casten funktioniert nicht, Sie haben tatsächlich erstellen Sie die string-Objekt wie
std::string(1, 'x')
Finden Sie unter coliru.stacked-crooked.com/a/af4051dd1d15972e, Wenn Sie dies tun, viel könnte es Wert, die Schaffung einer spezifischen Funktion, die nicht erfordert, erstellen Sie ein neues Objekt jedes mal.In den meisten Fällen ist es vorzuziehen, verwenden
tolower()
werden, wenn dabei eine case insensitive Suche. Auch Ada geändert, um Kleinbuchstaben! Es gibt Gründe, dass Unicode.org erklärt wahrscheinlich irgendwo, aber ich weiß nicht genau, warum.Groß ist besser msdn.microsoft.com/en-us/library/bb386042.aspx, aber natürlich nicht perfekt. Wenn Sie brauchen, Türkisch, das ist, hart zu sein, stackoverflow.com/questions/234591/upper-vs-lower-case - und haacked.com/archive/2012/07/05/...
Keine Vorlage benötigt in diesem Fall. Für C++17 möchten Sie vielleicht einen Blick auf string_view statt std::string skebanga.github.io/string-Ansicht
InformationsquelleAutor CC.
Warum nicht einfach konvertieren strings in Kleinbuchstaben um, bevor Sie anrufen
find()
?tolower
Hinweis:
Denn es ist sehr ineffizient für größere Zeichenfolgen.
Dies ist auch nicht wirklich eine gute Idee, wenn Sie Ihre software immer muss lokalisiert werden. Siehe Türkei-test: haacked.com/archive/2012/07/05/...
Die Argumente, die Sie werden entdecken, die das tun, basic-upcase und downcase-Operationen in C++ auf alles, was nicht kodiert als ANSI-wird Sie überwältigen xD Einfach ausgedrückt, ist es nicht trivial, für die standard-Bibliothek zu handhaben als C++17.
InformationsquelleAutor DavidS
warum nicht Steigern.StringAlgo:
InformationsquelleAutor gast128
Da machst du Teilstring suchen (std::string) und nicht element, (Zeichen -) sucht, gibt es leider keine bestehende Lösung, die ich mir bewusst bin, dass ist sofort verfügbar in der standard-Bibliothek, dies zu tun.
Dennoch, es ist einfach genug zu tun: einfach konvertieren, beide strings in Großbuchstaben (oder beide in Kleinbuchstaben, - ich wählte den oberen, in diesem Beispiel).
Dies ist nicht eine schnelle Lösung (grenzt in pessimization Gebiet), aber es ist die einzige, die ich kenne, aus der hand. Es ist auch nicht schwer zu implementieren Ihre eigenen case-insensitive substring-finder, wenn Sie sind besorgt über die Effizienz.
tolower/toupper im Gebietsschema arbeiten, wide-strings, so dass die Lösung oben sollte nur als zutreffend (einfach ändern, std::string, std::wstring).
[Bearbeiten] Eine alternative, wie hingewiesen, ist das anpassen Ihrer eigenen groß-und Kleinschreibung string-Typ von basic_string durch die Angabe Ihres eigenen Charakterzüge. Dies funktioniert, wenn man das akzeptieren kann alle string-Suche, Vergleiche, etc. zu werden, groß- /Kleinschreibung für einen bestimmten Typ string.
InformationsquelleAutor stinky472
Auch Sinn, um die Boost-version: mit Dieser änderung des ursprünglichen strings.
oder mit perfekten boost xPression Varianten Bibliothek
In diesem Beispiel sollten Sie darauf achten, dass Ihr Suchbegriff nicht irgendwelche Sonderzeichen.
InformationsquelleAutor Boris Ivanov
Wenn Sie wollen "echte" Vergleich nach Unicode und locale Regeln, verwenden Sie ICU
Collator
Klasse.InformationsquelleAutor Philipp
Etwas unsauber, aber kurz & schnell.
InformationsquelleAutor ziomq1991
Ich Liebe die Antworten von Kiril V. Lyadvinsky und CC. aber mein problem war ein wenig genauer als nur Fall-Gefühllosigkeit; ich brauchte ein faul von Unicode unterstützte command-line-argument-parser, beseitigen könnte falsch-positive/- negative beim Umgang mit alphanumerischen Zeichenfolge sucht, könnte spezielle Zeichen in der Zeichenfolge als Basis verwendet, um format alphanum keywords war ich auf der Suche gegen, z.B.,
Wolfjäger
sollte nicht mitjäger
aber<jäger>
sollte.Es ist im Grunde nur Kiril/CC ' s Antwort mit extra-Behandlung für alphanumerische genaue Länge entspricht.
"sollte" vielleicht ein bisschen stark für die Wortwahl, aber ich Stimme zu, dass es eine Verbesserung! 🙂 Ty & aktualisiert ^_^
InformationsquelleAutor kayleeFrye_onDeck