2009-12-13 6 views
1

Je std :: string avec le format follwingsimple, match générique avec std :: string

std::string s = "some string with @lable" 

Je dois trouver toutes les instances de '@', puis trouver l'identifiant juste après le '@', cet ID a une valeur (dans ce cas, 'lable' est stockée dans une table de recherche, puis je remplace le @ et l'id par la valeur trouvée.)

par exemple, supposons que l'étiquette d'identification ait la valeur ' 1000 'après le processus la chaîne va ressembler:

"some string with 1000" 

ma première version utilisait boost :: regex, mais j'ai dû le vider après m'avoir dit que les nouvelles libs ne sont pas autorisées dans les prochaines versions.

Y a-t-il une manière élégante de le faire avec les algorithmes std :: string et std de vanilla?

+3

Vous n'êtes pas autorisé à utiliser une nouvelle bibliothèque mais vous avez le droit d'écrire votre propre bibliothèque? –

+0

yap c'est ma vie dans le monde de dilbert ( – Eli

+1

Je pense que c'est le genre de cas où regex serait en fait une overkill, c'est plus lent et avec Boost je ne pense même pas que vous économiseriez sur loc ou la complexité dans ce cas. – wilhelmtell

Répondre

10

Vous pouvez utiliser std::find pour rechercher le @, et obtenir une paire de itérateurs formant une gamme qui commence à la @ et se termine au caractère suivant de l'espace blanc (ou à la fin de la chaîne). Il suffit ensuite de passer les itérateurs à std::string::replace() pour effectuer le remplacement de la sous-chaîne proprement dite.

Par exemple:

std::string s = "some string with @lable"; 
std::string::iterator beg = std::find(s.begin(), s.end(), '@'); 
std::string::iterator end = std::find(beg, s.end(), ' '); 
s.replace(beg, end, "whatever"); 

Si vous voulez aussi compter des choses comme des onglets ou des retours chariot comme des espaces, vous pouvez utiliser std::find_if avec ::isspace.

+0

+1 La mine est probablement trop lourde –

+1

N'oubliez pas de vérifier que vous avez effectivement trouvé quelque chose à remplacer, vous n'avez pas mentionné les contraintes sur vos entrées, s'il pouvait y avoir plus d'une occurrence d'un ID dans une chaîne, si l'on doit toujours être présent, etc ... –

1

Oui. utilisez std :: find pour rechercher @, puis std :: find pour rechercher de l'espace et copiez tout ce qui se trouve entre les deux.