Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Regex gesucht: Koordinaten (für C#) (https://www.delphipraxis.net/115122-regex-gesucht-koordinaten-fuer-c.html)

Phoenix 6. Jun 2008 09:05


Regex gesucht: Koordinaten (für C#)
 
:hi: Hi,

ich kenne mich mit Regexen ja mal so gar nicht aus.
Ich suche nun einen, um eine Eingabe von Koordinaten zu validieren (und auseinanderzunehmen).

Eingabebeispiel: 50° 30' 20'' (oder auch 50°30'20").
Das heisst, der Ausdruck müsste flexibel auf einzelne und doppelte Hochkommata reagieren, und zur Not auch ` oder ´ als Hochkommata (einzeln oder doppelt) akzeptieren, und sich nicht um Leerzeichen scheren.

Im Prinzip bräuchte ich was, was a) validiert und b) mir gleich ein Array mit den drei Werten zurückliefert. Dass Regexen sowas aufdröseln können weiss ich. Nur nicht, wie ;-)

Wie komme ich nun am geschicktesten zu so einem Ausdruck (wie gesagt: Ich weiss, dass es Regexen gibt und in etwa was sie können, aber ich habe keinen Plan wie die funktionieren).

Christian S. 6. Jun 2008 11:20

Re: Regex gesucht: Koordinaten (für C#)
 
Meinst Du sowas?
Code:
(\d{1,2})°[ ]*(\d{1,2})['´`][ ]*(\d{1,2})(?:"|''|``|´´)
Wenn Du das so anwendest:
Code:
//Oxygene
var rx := new Regex("(\d{1,2})°[ ]*(\d{1,2})['´`][ ]*(\d{1,2})(?:\"|''|``|´´)");
var match := rx.Match(deinString);
if match.Success then
begin
  var grad := Int32.Parse(match.Groups[1].ToString);
  var minuten := Int32.Parse(match.Groups[2].ToString);
  var sekunden := Int32.Parse(match.Groups[3].ToString);
end;
bekomsmt Du durch Groups Dein Array.

Quelltext ohne Gewähr, hab's nur im Forum getippt.

Phoenix 6. Jun 2008 11:30

Re: Regex gesucht: Koordinaten (für C#)
 
Zitat:

Zitat von Christian S.
Meinst Du sowas?

Möglich ;-)

Mich würd aber noch interessieren: Aber wie baut man sowas auf?

Christian S. 6. Jun 2008 13:31

Re: Regex gesucht: Koordinaten (für C#)
 
Zitat:

Zitat von Phoenix
Mich würd aber noch interessieren: Aber wie baut man sowas auf?

Meine Lieblings-Einführung zu regulären Echsen: http://tut.php-quake.net/regex.html

Man muss sich einfach angucken, was man in so einem Ausdruck haben willst. In deinem Beispiel:

Erstmal ein oder zwei Ziffer: (\d{1,2}) \d ist der Sammelausdruck für eine Ziffer
Dann das "°" Zeichen
Dann kein oder mehrere Leerzeichen: [ ]* [ ] ist eine Menge von Zeichen, in diesem Fall nur das Leerzeichen. * heißt "kein oder mehrmals"
Wieder ein oder zwei Ziffern
Nun willst Du eines dieser Zeichen haben: ' ´ `: ['´`]
Dann wieder kein oder mehrere Leerzeichen
Wieder ein oder zwei Ziffern
Anschließend willst Du " oder '' oder ´´ oder ``: (?:"|''|``|´´) "|" ist heißt "oder". "?:" sorgt dafür, dass die Klammer keine eigene Nummer bekommt


Alle Ausdrücke in Klammern, die kein "?:" am Anfang enthalten, sind Gruppen, die eine Nummer bekommen ("Look around" mal außen vor gelassen)

Daniel 6. Jun 2008 13:35

Re: Regex gesucht: Koordinaten (für C#)
 
Wie wäre es denn mit der Idee, den Ausdruck vorher zu normalisieren? Wenn Du sagst, dass es verschiedene Hochkommata geben kann, dann falte die doch auf ein ganz bestimmtes Hochkomma zusammen. Leerzeichen könnten beispielsweise gänzlich rausfliegen und am Ende hättest Du nur noch Ziffern, den Kringel und genau eine Art von Hochkomma, das entweder einfach oder doppelt vorkommt.

Das würde den regulären Ausdruck deutlich verinfachen.

Christian S. 6. Jun 2008 13:43

Re: Regex gesucht: Koordinaten (für C#)
 
Müsste man ausprobieren, was performanter ist. Immerhin sind Strings in .NET ja nicht veränderbar und bei einer Ersetzung wird immer ein neuer String angelegt. Dem entgegen steht, dass man Regexen in .NET auch in eine Assembly kompilieren und "fertig" ausliefern kann, womit man dann doch recht fix ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz