[Talk-de] REGEX in PERL wieder mal

Steffen Wolf stw at gmx.de
Fr Jun 11 12:27:04 UTC 2010


Hi GS,

> aus einer zeile wie:
>   <node id="507042" version="3" timestamp="2008-04-14T08:18:04Z" uid="8464" user="MichaH" lat="50.0693044" lon="8.4696183">

> möchte ich den user namen extrahieren. z.b. so:

> my ($user) = ($line =~ / user=\"(.+)\"/ ) ;

> problem dabei ist, dass statt des anführungszeichens nach user="xyz 
> schon mal ein paar weiter gesprungen wird. das ergebnis des regex sieht dann so aus (für user):

> MichaH" lat="50.0693044

> der regex "stoppt" also zu spät.

Greedy halt.

> wie kommt das? warum nimmt er lon=xxx nicht

Das wundert mich jetzt auch.

> wie mache ich es richtig?

/ user="[^"]*"/

oder, falls du es mal mit von JOSM gespeicherten Dateien zu tun hast:

/ user=['"][^'"]*['"]/

Ich mach meist alles in einem Rutsch:

if($line=~ /<node id=['"]([0-9]*)['"] version= ... user=['"](.*)['"] lat=['"]([0-9.]*)['"] ... /){
 $id=$1;
 $version=$2;
 ...
 $user=$5;
 $lat=$6;
 $lon=$7;
}

Das schlaegt aber dann fehl, wenn einzelne Elemente fehlen oder
vertauscht sind.

cu,
 stw
-- 
Weiner's Gesetz der Bibliotheken:
Es gibt keine Antworten, nur Querverweise.




Mehr Informationen über die Mailingliste Talk-de