Pregunta

Estoy usando grupos para tratar de igualar en un determinado patrón, y no obtengo los resultados que espero. El patrón de interés es el siguiente:

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

Para una cuerda 1.23, Yo obtengo $1=1.23, y $2=.23 que tiene sentido para mí.

Pero para la cadena 1.2.3, Yo obtengo $1=1.2.3 y $2=.3, donde esperaría $2=.2.3, porque su grupo es un punto decimal y un dígito, repetido.

¿Alguien puede explicarme cómo funciona esto? ¡Gracias!

¿Fue útil?

Solución 2

"Estas variables de coincidencia de patrones son escalares y, como tales, solo tendrán un valor único. Ese valor es lo que sea que coincida con los paréntesis de captura coincidentes ultimo."

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

En tu ejemplo, $1 partidos 1.2.3. A medida que se repite el patrón, $2 estaría configurado para .2 Hasta el partido final de .3

Otros consejos

Cuando usa grupos de captura con un cuantificador, solo el ultimo Se almacenará la repetición del patrón capturado.

Quizás esta regex satisfaga sus necesidades:

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

Este Regex separa la secuencia entera líder de sus componentes fraccionales repetidos.

(Como lo indica @ysth, tenga en cuenta que \d mayo coincidir con más personajes de lo que pretendes. Si ese es el caso, usa la clase de caracteres [0-9] en su lugar o use el /a modificador.)

Aquí hay un programa Perl que demuestra este Regex en un conjunto de datos de muestra. (También vea el demo en 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

Rendimiento esperado:

[1]  [.23]
[123]  [.456]
[3]  [.2.3]
[4]  [.22.333.444]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top