Domanda

Sto usando gruppi per provare a abbinare un determinato schema e non sto ottenendo abbastanza i risultati che mi aspetto. Il modello di interesse è il seguente:

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

Per stringa 1.23, Ottengo $1=1.23, e $2=.23 Il che ha senso per me.

Ma per la stringa 1.2.3, Ottengo $1=1.2.3 e $2=.3, dove mi aspetterei $2=.2.3, perché il suo gruppo è un punto decimale e una cifra, ripetuto.

Qualcuno può spiegarmi come funziona? Grazie!

È stato utile?

Soluzione 2

"Queste variabili di pattern corrispondono sono scalari e, come tali, manterranno solo un singolo valore. Quel valore è qualunque cosa le parentesi di cattura abbinate Ultimo."

http://blog

Nel tuo esempio, $1 corrispondenze 1.2.3. Come si ripete il modello, $2 sarebbe impostato su .2 fino alla partita finale di .3

Altri suggerimenti

Quando si utilizzano gruppi di cattura con un quantificatore, solo il Ultimo La ripetizione del modello catturato verrà immagazzinata.

Forse questo regex soddisferà le tue esigenze:

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

Questo Regex separa la sequenza interi principale dai suoi componenti frazionari ripetuti.

(Come indicato da @ysth, tieni presente questo \d Maggio Abbina più personaggi di quanto tu intenda. In tal caso, usa la classe dei caratteri [0-9] invece o usare il file /a modificatore.)

Ecco un programma Perl che dimostra questo regex su un set di dati di esempio. (Vedi anche il dimostrazione dal 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

Output previsto:

[1]  [.23]
[123]  [.456]
[3]  [.2.3]
[4]  [.22.333.444]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top