Pergunta

Eu estou usando grupos de tentar corresponder a um determinado padrão, e não estou conseguindo bastante os resultados que eu esperava.O padrão de interesse são como segue:

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

Para a cadeia de 1.23, Eu recebo $1=1.23, e $2=.23 o que faz sentido para mim.

Mas para a cadeia de 1.2.3, Eu recebo $1=1.2.3 e $2=.3, onde eu poderia esperar $2=.2.3, porque seu grupo é um ponto decimal e um dígito, repetido.

Alguém por favor pode me explicar como isso funciona?Obrigado!

Foi útil?

Solução 2

"Estes correspondência de padrão de variáveis escalares e, como tal, irão armazenar apenas um único valor.Esse valor é o que a captura parênteses correspondentes última."

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

No exemplo, $1 jogos 1.2.3.Como o padrão se repete, $2 teria de ser definido como .2 até a partida final da .3

Outras dicas

Quando você usa os grupos de captura com um quantificador, apenas o último A repetição do padrão capturado será armazenada.

Talvez este regex atenda às suas necessidades:

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

Esse regex separa a sequência inteira principal de seus componentes fracionários repetidos.

(Conforme indicado por @ySth, lembre -se de que \d poderia combinar mais personagens do que você pretende. Se for esse o caso, use a classe de caracteres [0-9] em vez /a modificador.)

Aqui está um programa PERL que demonstra esse regex em um conjunto de dados de amostra. (Veja também o demonstração ao vivo.)

#!/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

Saída esperada:

[1]  [.23]
[123]  [.456]
[3]  [.2.3]
[4]  [.22.333.444]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top