2009-12-16 4 views
0

La réponse à cela peut être un simple non, mais voilà ...C++ Boost regex élément qui était vrai

J'utilise actuellement la fonction boost regex_match pour évaluer une chaîne à une valeur de regex. Au lieu de simplement renvoyer T/F, existe-t-il un moyen de savoir quel élément de plusieurs instructions jointes est évalué à true?

Par exemple:

^a$|^z$|^p$ 

a --> 0 
z --> 1 
f --> -1 

Répondre

2

Enfermez les entre parenthèses capturant, puis test qui correspond sous-expression.

(^a$)|(^z$)|(^p$) 


match_results m; 
regex_match(..., m); 

a ->m[1].matched

z ->m[2].matched

p ->m[3].matched

Mise à jour:

Vous pourriez être en mesure d'améliorer en faisant une seule capture grouper et tester le résultat, p.ex.:

^([azp])$ 
... 
if ('a' == m[0][0]) ... 

L'une ou l'autre des méthodes est presque certainement plus rapide que d'appeler regex_match trois fois, bien que pour être sûr que vous avez juste à le tester. À moins que vous ne le fassiez souvent , la différence ne vaut pas la peine d'être inquiétée.

Évidemment, assurez-vous que vous ne configurez l'expression régulière qu'une seule fois, pas à chaque fois que vous en avez besoin.

Si vous avez besoin d'être vraiment, très vite, vous ne devriez probablement pas utiliser une regex.

+0

Auriez-vous un aperçu des vitesses de votre solution par rapport à l'appel de regex_match à trois reprises? – tinkertime

+0

Je pense que si vous êtes si préoccupé par la vitesse, vous devriez utiliser un lexer personnalisé (ou lex) au lieu d'une regex. Plus probablement, cela ne vaut pas la peine de s'inquiéter. –

0

Si vous souhaitez analyser votre texte correspondant à ce niveau de détail, vous devriez peut-être envisager d'utiliser Spirit de boost au lieu de regex.

Questions connexes