regulärer Ausdruck zum Parsen einer Koordinate gesucht
robome
- perl
Hallo,
ich suche nach einem regulären Ausdruck der mir die Bestandteile einer Geokoordinate zurückliefert. Also ich habe schon einen, der kommt mir jedoch unnötig kompliziert und lange vor. Vielleicht könnt ihr mir weiterhelfen da ich selbst auf keinen besseren komme.
Die Koordinaten sollen ziemlich locker geparst werden, also ohne zu strenge Regeln. Grundsätzlich ist alles von
35° 14' 33.39" N
über
+35 deg 04, 33.39S
bis
-48 17.5' .98
erlaubt. Die fünf Felder sind Vorzeichen (+-), bis zu drei Fließkommazahlen (Punkt ist Dezimaltrenner) und Himmelrichtung (NOSW). Zwischen den Feldern sind alle möglichen Trennzeichen erlaubt die nicht in den Feldern selbst vorkommen.
Vorzeichen und Himmelsrichtung sind optional, genauso wie bis zu zwei Zahlen. Welche der Zahlen Grad, Minuten und Sekunden sind, wird nur durch die Position bestimmt.
Je einfacher der Ausdruck zu lesen (für den Menschen) und je schneller er auszuführen ist, desto besser.
Ciao,
Robert
gudn tach!
Also ich habe schon einen, der kommt mir jedoch unnötig kompliziert und lange vor.
auspacken!
Die Koordinaten sollen ziemlich locker geparst werden, also ohne zu strenge Regeln. Grundsätzlich ist alles von
35° 14' 33.39" N
über
+35 deg 04, 33.39S
bis
-48 17.5' .98
ich orientiere mich an den beispielen:
$str=~/^([+-]?)(.*?)([NSWO]?)\s+\z/;
my $vorzeichen = $1;
my $himmelsrichtung = $3;
my @zahlen = split /[^+0-9.-]+/, $2;
hab's nicht ausprobiert. aber so in etwa sollte es funzen.
Je einfacher der Ausdruck zu lesen (für den Menschen) und je schneller er auszuführen ist, desto besser.
haeufig frisst das eine das andere.
prost
seth
Hallo auch
auspacken!
/([+-])?([\d.]+)[^\d.SWNE]*([\d.]+)?[^\d.]*?([\d.]+)?[^\d.]*?(S|W|N|O)?$/;
Es ist wohl ersichtlich wieso ich auf die Regex nicht allzu stolz bin. Und obwohl sie bisher alle Tests überstand bin ich mir noch nichtmal sicher dass sie alles schluckt.
ich orientiere mich an den beispielen:
$str=~/^([+-]?)(.*?)([NSWO]?)\s+\z/;
my $vorzeichen = $1;
my $himmelsrichtung = $3;
my @zahlen = split /[^+0-9.-]+/, $2;
>
> hab's nicht ausprobiert. aber so in etwa sollte es funzen.
Danke Dir!
Wenn ich \s+ weglasse, funktioniert es.
Sieht gut aus, split hatte ich ganz vergessen.
> > Je einfacher der Ausdruck zu lesen (für den Menschen) und je schneller er auszuführen ist, desto besser.
>
> haeufig frisst das eine das andere.
So anscheinend auch hier.
Mein Bandwurm benötigt ca. 40% weniger Zeit, ist aber schlechter lesbar.
Ciao,
Robert
gudn tach Robert!
auspacken!
/([+-])?([\d.]+)[^\d.SWNE]*([\d.]+)?[^\d.]*?([\d.]+)?[^\d.]*?(S|W|N|O)?$/;
Es ist wohl ersichtlich wieso ich auf die Regex nicht allzu stolz bin. Und obwohl sie bisher alle Tests überstand bin ich mir noch nichtmal sicher dass sie alles schluckt.
auf den ersten blick faellt mir bloss auf, dass du statt (S|W|N|O)? kuerzer ([SWNO])? schreiben solltest, was uebersichtlicher _und_ schneller in der ausfuehrung ist. sonst ist's eigentlich ok.
mit dem x-modifier (siehe perldoc perlre) kannst du den code etwas uebersichtlicher gestalten und auch kommentieren.
$str=~/^([+-]?)(.*?)([NSWO]?)\s+\z/;
my $vorzeichen = $1;
my $himmelsrichtung = $3;
my @zahlen = split /[^+0-9.-]+/, $2;
hab's nicht ausprobiert. aber so in etwa sollte es funzen.
Danke Dir!
Wenn ich \s+ weglasse, funktioniert es.
oops, ja, haette ein \s* sein sollen.
Je einfacher der Ausdruck zu lesen (für den Menschen) und je schneller er auszuführen ist, desto besser.
haeufig frisst das eine das andere.
So anscheinend auch hier.
Mein Bandwurm benötigt ca. 40% weniger Zeit, ist aber schlechter lesbar.
hmm, bei mir sind's 30%. 40% bekomm ich erst hin, wenn ich die himmelsrichtungsabfrage wie oben beschrieben aendere.
wenn dir geschwindigkeit wichtig ist (d.h. wenn der kram mehrere tausend mal in kurzer zeit aufgerufen werden soll), dann wuerde ich an deiner stelle die schnellere variante nehmen.
prost
seth
Hallo Seth,
auf den ersten blick faellt mir bloss auf, dass du statt (S|W|N|O)? kuerzer ([SWNO])? schreiben solltest, was uebersichtlicher _und_ schneller in der ausfuehrung ist. sonst ist's eigentlich ok.
Schneller auch? Danke für den Tip.
mit dem x-modifier (siehe perldoc perlre) kannst du den code etwas uebersichtlicher gestalten und auch kommentieren.
Auch da hast Du Recht, danke dafür mir das wieder ins Gedächtnis zu rufen.
wenn dir geschwindigkeit wichtig ist (d.h. wenn der kram mehrere tausend mal in kurzer zeit aufgerufen werden soll), dann wuerde ich an deiner stelle die schnellere variante nehmen.
Mache ich dann auch, es geht tatsächlich nicht um einen einzigen Aufruf.
Danke,
Robert