Regex-Problem

19/01/2015 - 17:23 von Jan Schmidt | Report spam
Hallo NG,

ich müsste zwei Regex oder verknüpfen und anschließend eine Zahl
extrahieren. So wie $re1. Allerdings brauche ich das Ergebnis in $1
und nicht wie im Beispiel in $2.

Ich hab keine Idee, wie ich $re bauen soll, dass beide Teile matchen.

Kann mir jemand helfen?

Ausgabe:

re:
re1: 1152
re: 24
re1: 24

Prog:

use strict;

my$filelike = <<EOF;
42c: d9 aa 80 ef lea %sp,[%sp]-1152
0: 20 18 sub.a %sp,24
EOF

my$re;
#$re = qr/.*lea.*\[%sp\]-([0-9]{1,4})/o;
#$re = qr/.*sub\.a.*%sp,([0-9]{1,4})/o;
$re = qr/.*lea.*\[%sp\]-|.*sub\.a.*%sp,([0-9]{1,4})/;
my$re1 = qr/(.*lea.*\[%sp\]-|.*sub\.a.*%sp,)([0-9]{1,4})/;

open my $fh, '<', \$filelike or die $!;
while (<$fh>)
{
my$line = $_;
if ($line =~ m/$re/)
{
print "re: ".$1."";
}
if ($line =~ m/$re1/)
{
print "re1: ".$2."";
}
}
close $fh or die $!;

danke,
jan
 

Lesen sie die antworten

#1 ReneeB
20/01/2015 - 09:00 | Warnen spam
Hallo Jan,

Am Montag, 19. Januar 2015 17:23:15 UTC+1 schrieb Jan Schmidt:
my$re1 = qr/(.*lea.*\[%sp\]-|.*sub\.a.*%sp,)([0-9]{1,4})/;




dafür gibt es die "non-capturing groups". Da nimmt man statt "()" einfach "(?:)". Damit werden die Treffer nicht in den $#-Variablen gespeichert. Also:

my $re1 = qr/(?:.*lea.*\[%sp\]-|.*sub\.a.*%sp,)([0-9]{1,4})/;

Um das ganze lesbarer zu machen würde ich noch den x-Modifier nehmen:

my $re1 = qr/
(?: # speichern des folgenden Ausdruckes ausschalten
.*lea.*\[%sp\]- | # entweder was mit "lea"
.*sub\.a.*%sp, # oder mit "sub"
)
([0-9]{1,4}) # matche die Zahl
/;

Jetzt hast Du die Zahl in $1

Ähnliche fragen