2009-05-07 7 views
1

Ich versuche, eine Zeichenfolge in Perl mit dem Format zu analysieren:Wie kann ich eine variierende Anzahl von Zifferngruppen aus einer Perl-Zeichenfolge extrahieren?

Messages pushed to the Order Book queues 123691 121574 146343 103046 161253

ich wie die Zahlen am Ende der Schnur so beabsichtigen, ein Spiel zu tun zugreifen möchten

/(\d+)/s

Mein Problem ist, dass die Anzahl der Werte am Ende eine variable Anzahl von Zeichenfolgen enthält.

Was ist der beste Weg, um die Regexp zu formatieren, um auf jede dieser Nummern einzeln zugreifen zu können? Ich bin ein C++ - Entwickler und lerne gerade Perl, also versuche ich, den saubersten Perl-Weg zu finden, um dies zu erreichen.

Danke für Ihre Hilfe.

+1

\ d stimmt nicht mit [0-9] in Perl 5.8 und 5.10 überein; Es entspricht einem UNICODE-Zeichen, das das Attribut digit (einschließlich "\ x {1815}", MONGOLIAN DIGIT FIVE) enthält. Wenn Sie [0-9] meinen, müssen Sie entweder [0-9] verwenden oder das Pragma bytes verwenden (aber es verwandelt alle Zeichenfolgen in 1-Byte-Zeichen und ist normalerweise nicht das, was Sie wollen). –

Antwort

6

einfach den/g-Flag verwenden, um das Spiel Betreiber zu machen ausführt ein globales Spiel. Im Listenkontext gibt den Match-Operator alle Ergebnisse als Liste:

@result = $string =~ /(\d+)/g; 

Dies funktioniert, wenn es keine andere Zahlen als die Hinter diejenigen sind.

0

ich so etwas tun würde:

my @numbers; 
if (m/Messages pushed to the Order Book queues ([\d\s]+)/) { 
    @numbers = split(/\s+/, $1); 
} 

Keine Notwendigkeit, es in einen regulären Ausdruck zu stopfen.

+1

Es gibt viele elegante Möglichkeiten, dies zu tun, siehe die anderen Antworten. –

1

„Im skalaren Kontext wird jede Ausführung von m // g nächste Spiel findet, gibt true zurück, wenn es passt, und falsch, wenn es keine weiteren Spiel ist“ - (Von perldoc perlop)

So sollten Sie sein Lage, eine globale Regex Schleife zu machen, etwa so:

while ($string =~ /(\d+)/g) { 
    push @queuelist, $1; 
} 
+0

Das ist ein bisschen mehr Arbeit als Sie wirklich brauchen. :) –

4

Sie können den Übereinstimmungsoperator in einem Listenkontext mit dem globalen Flag verwenden, um eine Liste aller in Klammern aufgezeichneten Erfassungen zu erhalten. Beispiel:

@list = ($string =~ /(\d+)/g); 

Ihre Liste sollte nun alle Zifferngruppen in Ihrer Zeichenfolge enthalten. Weitere Informationen finden Sie in der Dokumentation zu match operator.

Verwandte Themen