Question

J'utilise des groupes pour essayer de faire correspondre un certain modèle et je n'obtiens pas tout à fait les résultats que j'attends. Le modèle d'intérêt est le suivant:

([0-9]+(\.[0-9]+)+)

Pour la chaîne 1.23, Je reçois $1=1.23, et $2=.23 ce qui a du sens pour moi.

Mais pour la chaîne 1.2.3, Je reçois $1=1.2.3 et $2=.3, où je m'attendrais $2=.2.3, parce que son groupe est un point décimal et un chiffre, répété.

Quelqu'un peut-il m'expliquer comment cela fonctionne? Merci!

Était-ce utile?

La solution 2

"Ces variables de correspondance de motifs sont des scalaires et, en tant que tels, ne tiendront qu'une seule valeur. Cette valeur est ce que les parenthèses de capture correspondent dernière."

http://blogs.perl.org/users/sirhc/2012/05/repeated-capturing-and-parsing.html

Dans votre exemple, $1 allumettes 1.2.3. Comme le motif se répète, $2 serait réglé sur .2 Jusqu'au dernier match de .3

Autres conseils

Lorsque vous utilisez des groupes de capture avec un quantificateur, seul le dernière La répétition du modèle capturé sera stockée.

Peut-être que ce regex répondra à vos besoins:

\b(\d+)((?:\.\d+)+)\b

Ce regex sépare la séquence entière principale de ses composants fractionnaires répétitifs.

(Comme indiqué par @YSTH, gardez à l'esprit que \d peut Faites correspondre plus de personnages que vous l'intendez. Si tel est le cas, utilisez la classe de caractères [0-9] à la place ou utilisez le /a modificateur.)

Voici un programme Perl qui démontre ce regex sur un échantillon de données. (Voir aussi le démo en direct.)

#!/usr/bin/perl -w

use strict;
use warnings;

while (<DATA>) {
    chomp;

    # A - A sequence of digits
    # B - A period and a sequence of digits
    # C - Repeat 'B'.

    if (/\b(\d+)((?:\.\d+)+)\b/) {
#           ^^^     ^^^^^
#            A        B
#                   ^^^^^^^
#                      C

        print "[$1]  [$2]\n";
    }
}

__END__
1.23
123.456
1.2.3
1.22.333.444

Production attendue:

[1]  [.23]
[123]  [.456]
[3]  [.2.3]
[4]  [.22.333.444]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top