2011-01-14 10 views
2

Ich habe eine Zeile, die mehrere Instanzen von Square-eckigen Daten enthält.Wie extrahiere ich Daten in eckigen Klammern, die mehrmals in einer Zeile mit Perl angezeigt werden?

[data 1] junk [data 2] junk,junk [data 3] junk [data 4] 

Hat jemand eine Goo Regex? So kann ich verwenden

print $1,$2,$3,$4; 

Vielen Dank!

+4

Wie Sie, dass regex ziemlich viel auf den Junk-Daten abhängt. Wenn die eckigen Klammern verschachteln können, ist die Sprache außerdem so komplex, dass sie nicht mit regulären Ausdrücken analysiert werden kann. Sie können es mit den Perl-Regex-Erweiterungen tun, aber es ist dreckig wie die Hölle. In diesem Fall ist es besser, stattdessen einen Parser-Generator zu verwenden. – arnsholt

+0

Verstrichene Zeit [846.078000] bis [857.562000], Uhr [Uhr 1], Monat [Dezember] – nebulus

Antwort

4
my $s = "[data 1] junk [data 2] junk,junk [data 3] junk [data 4]"; 
my ($one, $two, $three, $four) = $s =~ /\[([^\]]*)\]/g; 
print $one, $two, $three, $four; 
+4

Dies setzt voraus, dass verschachtelte Paare von eckigen Klammern nicht zulässig sind. – cam

+0

Ich brauche etwas, wo ich drucken kann $ 1, $ 2, $ 3, $ 4 – nebulus

+0

@seaworthy, ich werde nicht ändern, um $ 1, $ 2, $ 3, $ 4 zu verwenden, aber ich habe meine Antwort bearbeitet, um eine entsprechende Verwendung zu ermöglichen . – cam

7

Verwenden Sie anstelle einer Regex .

1

Wenn alle auf der Suche nach einem schnellen Ausdruck ist, das sollte es tun ..

$s = q([data 1] junk [data 2] junk,junk [data 3] junk [data 4]);
print join(', ', @{[$s =~ /\[(.*?)\]/g]}), "\n";

Verwandte Themen