Frage

Ich verwende Gruppen, um zu versuchen, ein bestimmtes Muster zu erreichen, und bekomme nicht die Ergebnisse, die ich erwarte. Das Interessenmuster ist wie folgt:

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

Für String 1.23, Ich bekomme $1=1.23, und $2=.23 Was für mich Sinn macht.

Aber für String 1.2.3, Ich bekomme $1=1.2.3 und $2=.3, wo ich erwarten würde $2=.2.3, weil seine Gruppe ein Dezimalpunkt ist und eine Ziffer wiederholt ist.

Kann mir bitte jemand erklären, wie das funktioniert? Vielen Dank!

War es hilfreich?

Lösung 2

"Diese Musterübereinstimmungsvariablen sind Skalare und halten daher nur einen einzelnen Wert. Dieser Wert ist alles, was die erfassenden Klammern übereinstimmen letzte."

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

In Ihrem Beispiel, $1 Streichhölzer 1.2.3. Wenn sich das Muster wiederholt, $2 würde auf eingestellt sein auf .2 bis zum letzten Spiel von .3

Andere Tipps

Wenn Sie Gruppen mit einem Quantifizierer erfassen, nur die letzte Die Wiederholung des erfassten Musters wird gespeichert.

Vielleicht erfüllt dieser Regex Ihren Bedürfnissen:

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

Dieser Regex trennt die führende Ganzzahlsequenz von ihren sich wiederholenden Bruchkomponenten.

(Wie durch @YSth angegeben, denken Sie bitte daran, dass \d kann Passen Sie mehr Charaktere an als du beabsichtigen. Wenn dies der Fall ist, verwenden Sie die Zeichenklasse [0-9] Stattdessen oder verwenden Sie die /a Modifikator.)

Hier ist ein Perl -Programm, das diesen Regex auf einem Beispieldatensatz demonstriert. (Siehe auch die Live -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

Erwartete Ausgabe:

[1]  [.23]
[123]  [.456]
[3]  [.2.3]
[4]  [.22.333.444]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top