1 2 3 4 5 6 7 8 9 10 11
use strict; use warnings; my $line = <DATA>; my (@caught) = ($line =~ /(?:X<([^>]+)>)/g); # äußere Klammer wird nicht gefangen wegen ?: print "$_\n" for (@caught); 1; __DATA__ X<$!> X<$ERRNO> X<$OS_ERROR>
2014-10-21T12:26:22 GwenDragonSo geht doch auch:Code (perl): (dl )my (@catched)
QuoteMit / X<(.+?)>/g klappts auch, könnte aber auch falsch positive Treffer bringen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#! /usr/bin/perl -l use strict; use warnings; while ( <DATA> ) { # die ersten 1-5 X<foo> ab Zeilenanfang einfangen if ( $_ =~ m/^X(<\S+>(?: X<\S+>){0,4})/ ) { # splitten am " X" und die Klammern entfernen my @matches = map { s/^<|>$//g; $_ } split m/\s+X/, $1; # Kontrolle print join "--", @matches; } else { print STDERR "no matches."; } } __DATA__ X<$!> X<$ERRNO> X<$OS_ERROR>
X<$;> X<$SUBSEP> X<SUBSCRIPT_SEPARATOR>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#! /usr/bin/perl -l use strict; use warnings; while ( <DATA> ) { if ( $_ =~ m/^X(<.+>(?: X<.+?>){0,4})/ ) { my @matches = map { s/^<+\s*|\s*>+$//g; $_ } split m/\s+X/, $1; print join "--", @matches; } else { print STDERR "no matches."; } } __DATA__ X<$!> X<$ERRNO> X<$OS_ERROR> X<< $< >> X<$UID> X<$REAL_USER_ID> X<$;> X<$SUBSEP> X<SUBSCRIPT_SEPARATOR>
QuoteFazit: In Wiederholungsklammern darf keine fangende Klammer vorkommen.
Ich schreibe dies für den Fall, dass wieder jemand in diese Falle tappt.
2014-10-22T11:40:49 LinuxerIch habe ja nur eine Alternative dazu beschrieben.
QuoteNeben der Erkenntnis, dass einfangende Klammern innerhalb von Wiederholungen ungünstig sein können, ist Dir denn klar geworden, warum sich das ganze so verhält wie es das tut?
QuoteMeine ... Regex hatte ... - ebenfalls richtig - jeden Nachfolger-Treffer in $2 abgelegt.
2014-10-22T14:15:51 GUIfreundQuoteNeben der Erkenntnis, dass einfangende Klammern innerhalb von Wiederholungen ungünstig sein können, ist Dir denn klar geworden, warum sich das ganze so verhält wie es das tut?
Vermutlich ja (bei mir kann ich mir (fast) nie so ganz sicher sein).
Zitat aus dem OP:QuoteMeine ... Regex hatte ... - ebenfalls richtig - jeden Nachfolger-Treffer in $2 abgelegt.
... weil die öffnende fangende Klammer die 2. in der Regex war.