Insensible à la casse std::string.find()
Je suis en utilisant std::string
's find()
méthode pour tester si une chaîne est une chaîne à une autre. Maintenant, j'ai besoin de la casse de la version de la même chose. Pour la comparaison de chaînes, je peux toujours vous tourner vers stricmp()
mais il ne semble pas être un stristr()
.
J'ai trouvé des réponses très diverses et les plus suggérons d'utiliser Boost
qui n'est pas une option dans mon cas. En outre, j'ai besoin de soutien std::wstring
/wchar_t
. Des idées?
Il y a un Gotw sur ce sujet : gotw.ca/gotw/029.htm
stristr n'est pas là, mais "char *strcasestr(const char *la botte de foin, const char *aiguille);" est-il. N'est-ce ok?
stristr n'est pas là, mais "char *strcasestr(const char *la botte de foin, const char *aiguille);" est-il. N'est-ce ok?
strcasestr
n'est pas disponible sous Windows.OriginalL'auteur wpfwannabe | 2010-06-30
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
std::search
avec un prédicat.Mis à jour avec de travail de la version C++.
Parfait! Chemin à parcourir!
Excellente solution
Pourquoi êtes-vous à l'aide de modèles ici?
OriginalL'auteur Kirill V. Lyadvinsky
Le nouveau C++11 style:
Explication de la std::recherche peuvent être trouvés sur cplusplus.com.
c
dans une chaînestr
en utilisant la même fonction. l'appel à l'aidefindStringIC(str, (string)c)
ne marche pasCe type de char à chaîne cast ne fonctionne pas, vous avez fait à créer la chaîne de l'objet comme
std::string(1, 'x')
Voir coliru.stacked-crooked.com/a/af4051dd1d15972e Si vous faites cela un lot, il pourrait en vaut la création d'une fonction spécifique qui ne nécessite pas la création d'un nouvel objet à chaque fois.Dans la plupart des cas, il est préférable d'utiliser
tolower()
lorsque vous faites une recherche insensible à la casse. Même Ada changé en minuscules! Il y a des raisons qui Unicode.org explique probablement quelque part mais je ne sais pas exactement pourquoi.Majuscules est mieux msdn.microsoft.com/en-us/library/bb386042.aspx mais pas parfaite. Si vous avez besoin de turc, ça va être dur stackoverflow.com/questions/234591/upper-vs-lower-case et haacked.com/archive/2012/07/05/...
Pas de modèle nécessaire dans ce cas. Pour le C++17 vous voudrez peut-être jeter un oeil à string_view au lieu de std::string skebanga.github.io/chaîne de vue
OriginalL'auteur CC.
Pourquoi ne pas simplement convertir les chaînes de caractères en minuscules, avant d'appeler
find()
?tolower
Avis:
Parce qu'il est très inefficace pour les grandes chaînes.
Ce n'est pas vraiment une bonne idée si votre logiciel n'a besoin d'être localisées. Voir la Turquie test: haacked.com/archive/2012/07/05/...
Les arguments que vous allez découvrir pour faire de base upcase et downcase opérations en C++ sur ce qui n'est pas encodé en ANSI vous submerger xD bref, c'est pas banal pour la bibliothèque standard pour traiter de C++17.
OriginalL'auteur DavidS
pourquoi ne pas utiliser Boost.StringAlgo:
OriginalL'auteur gast128
Puisque vous êtes en train de faire sous-chaîne de recherches (std::string) et pas d'élément (personnage) des recherches, il n'y a malheureusement pas de solution, je suis au courant de qui est immédiatement accessible dans la bibliothèque standard pour ce faire.
Néanmoins, il est assez facile: il suffit de convertir les chaînes de caractères en majuscules (ou les deux à la baisse des cas, j'ai choisi supérieure dans cet exemple).
Ce n'est pas une solution rapide (frontière dans pessimization territoire) mais c'est le seul que je connaisse de la main gauche. C'est pas non plus difficile à mettre en œuvre votre propre casse de chaîne de finder si vous êtes inquiet au sujet de l'efficacité.
tolower/toupper dans les paramètres régionaux travailleront sur l'échelle de cordes, de sorte que la solution ci-dessus devrait être tout aussi applicable (changement simple std::string à std::wstring).
[Modifier] Une alternative, comme l'a souligné, est de s'adapter à votre propre casse de chaîne type de basic_string en précisant vos propres traits de caractère. Cela fonctionne si vous pouvez accepter toutes les recherches de chaînes, de comparaisons, etc. pour être sensible à la casse pour une donnée de type chaîne de caractères.
OriginalL'auteur stinky472
Logique de fournir Boost version: Cela va modifier les chaînes d'origine.
ou à l'aide de parfait boost xpression de la bibliothèque
Dans cet exemple, vous devriez faire attention à ce que votre mot de recherche n'ont pas de regex caractères spéciaux.
OriginalL'auteur Boris Ivanov
Si vous voulez “réel” comparaison selon Unicode et les paramètres régionaux règles, utilisez Intensifs
Collateur
de la classe.OriginalL'auteur Philipp
Un peu sale, mais court & rapide.
OriginalL'auteur ziomq1991
J'adore les réponses de Cyrille V. Lyadvinsky et CC. mais mon problème était un peu plus précis que simplement l'insensibilité à la casse; j'avais besoin d'un paresseux compatibles Unicode argument de ligne de commande de l'analyseur qui pourrait permettre d'éliminer les faux positifs/négatifs lorsqu'ils traitent avec chaîne alphanumérique de recherches qui pourraient avoir des caractères spéciaux dans la chaîne de base utilisé pour le format numérique des mots-clés, je cherchais à l'encontre, par exemple,
Wolfjäger
ne devrait pas correspondre àjäger
mais<jäger>
devrait.Il est fondamentalement juste Kiril/CC réponse à la manutention supplémentaire pour alphanumériques exacte de la longueur des matches.
"devrait" peut-être un peu forte pour les mots, mais je suis d'accord que c'est une amélioration! 🙂 Ty & mises à jour ^_^
OriginalL'auteur kayleeFrye_onDeck