Vra

Ek gebruik groepe om op 'n sekere patroon te probeer ooreenstem, en kry nie die resultate wat ek verwag nie. Die patroon van belang is soos volg:

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

Vir string 1.23, Ek kry $1=1.23, en $2=.23 wat vir my sin maak.

Maar vir string 1.2.3, Ek kry $1=1.2.3 en $2=.3, waar ek sou verwag $2=.2.3, omdat sy groep 'n desimale punt en 'n syfer is, herhaal.

Kan iemand my asseblief verduidelik hoe dit werk? Dankie!

Was dit nuttig?

Oplossing 2

"Hierdie patroonwedstrydveranderlikes is skalare en sal as sodanig slegs 'n enkele waarde hê. Die waarde is wat ook al die vaslegging van hakies ooreenstem laaste."

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

In jou voorbeeld, $1 vuurwerke 1.2.3. Soos die patroon herhaal, $2 sou ingestel wees op .2 tot die laaste wedstryd van .3

Ander wenke

As u groepe met 'n kwantifiseerder gebruik, is slegs die laaste Herhaling van die vasgelegde patroon sal gestoor word.

Miskien sal hierdie regex aan u behoeftes voldoen:

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

Hierdie regex skei die voorste heelgetal -volgorde van die herhalende fraksionele komponente.

(Soos aangedui deur @ysth, moet u dit in gedagte hou \d mag Pas meer karakters as wat jy van plan is. As dit die geval is, gebruik die karakterklas [0-9] in plaas daarvan of gebruik die /a wysiger.)

Hier is 'n PERL -program wat hierdie regex op 'n steekproefdatastel demonstreer. (Kyk ook na die Lewende demo.)

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

Verwagte uitset:

[1]  [.23]
[123]  [.456]
[3]  [.2.3]
[4]  [.22.333.444]
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top