[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