2009-08-24 5 views
2

J'utilise C++ tr1 :: regex avec la grammaire ECMA regex. Ce que j'essaie de faire est d'analyser un en-tête et de renvoyer des valeurs associées à chaque élément de l'en-tête.Existe-t-il un moyen d'avoir une capture répète un nombre arbitraire de fois dans une regex?

tête:

-Testing some text 
-Numbers 1 2 5 
-MoreStuff some more text 
-Numbers 1 10 

Ce que je voudrais faire est de trouver toutes les lignes « -Numéros » et mettre chaque numéro dans son propre résultat avec une seule regex. Comme vous pouvez le voir, les lignes "-Numbers" peuvent avoir un nombre arbitraire de valeurs sur la ligne. Actuellement, je suis juste à la recherche de "-Numbers ([\ s0-9] +)" et ensuite tokenizing ce résultat. Je me demandais juste s'il y avait un moyen de trouver et de marquer les résultats dans une seule regex.

Répondre

2

Non, il n'y en a pas.

0

J'étais sur le point de poser exactement la même question, et j'ai trouvé une solution.

Disons que vous avez un nombre arbitraire de mots que vous voulez capturer.

"il y a quatre lumières"

et

"capitaine picard est la bombe"

On pourrait penser que la solution est:

/((\w+)\s?)+/ 

Mais cela seul match toute la chaîne d'entrée et le dernier groupe capturé.

Ce que vous pouvez faire est d'utiliser le commutateur "g".

Ainsi, un exemple en Perl:

use strict; 
use warnings; 

my $str1 = "there are four lights"; 
my $str2 = "captain picard is the bomb"; 

foreach ($str1, $str2) { 
    my @a = ($_ =~ /(\w+)\s?/g); 
    print "captured groups are: " . join("|", @a) . "\n"; 
} 

sortie est:

captured groups are: there|are|four|lights 
captured groups are: captain|picard|is|the|bomb 

Donc, il y a une solution si votre langue de choix prend en charge un équivalent de "g" (et je suppose la plupart font ...).

J'espère que cela aide quelqu'un qui était dans la même position que moi!

S

Questions connexes