Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   RegEx - Ich steig da nicht durch... (https://www.delphipraxis.net/132837-regex-ich-steig-da-nicht-durch.html)

Mithrandir 20. Apr 2009 19:47


RegEx - Ich steig da nicht durch...
 
Hi ihr,

als Folge aus meinem letzten Thread habe ich jetzt mal die Zeit gefunden, mich um meinen OSM-Extractor zu kümmern. Die Klasse für die Datenbank ist aufgesetzt und wartet begierig darauf, endlich mit Daten gefüttert zu werden.

Ich hatte dunkel im Kopf, dass es für Delphi eine RegEx-Implementation gab, und, tadaa, ich hab sie auch gefunden.

Ein simpler Speedtest zwischen TRegExpr und PosEx brachte zumindest bei der Suche des Ausdrucks "<node" zu Tage, dass TRegExpr schneller ist. Also bieten sich reguläre Ausdrücke an.

Nun, den Kurs auf Regenechsen habe ich schon durch, die Syntax-Beschreibung zu der Komponente auch. Aber ich bekomme es nicht hin. Ich habe schon die unterschiedlichsten Kombinationen durchprobiert.

Dabei möchte ich eigentlich nur folgendes:

XML-Code:
<node id="297497923" lat="54.3298467" lon="10.053805" user="seawolff" visible="true" timestamp="2009-01-25T20:36:37+00:00"/>

<node id="303856929" lat="54.3283192" lon="10.0530744" user="desc" visible="true" timestamp="2008-11-16T12:43:49+00:00">
 <tag k="highway" v="turning_circle"/>
</node>

<way id="27730376" visible="true" timestamp="2009-01-01T20:19:47+00:00" user="nhoffm">
 <nd ref="304510582"/>
 <nd ref="304510583"/>
 <nd ref="304510584"/>
 <nd ref="304510585"/>
 <nd ref="304510586"/>
 <tag k="name" v="Kongsbergweg"/>
 <tag k="created_by" v="Potlatch 0.10f"/>
 <tag k="highway" v="footway"/>
</way>
Wie man sieht, gibt es eigentlich drei Möglichkeiten:
  • Entweder endet der Knoten mit einem "/>", oder
  • es befindet sich beim "node" - Knoten noch ein oder mehrere Elemente dazwischen, oder
  • es gibt einen anderen Tag, mit entsprechenden Unterelemente dazwischen

Ich verlange von dem Ausdruck ja nichtmal, dass er mir alles auflistet. Schön wäre, wenn der Ausdruck / die Ausdrücke folgende Aufgaben erfüllen könnten:
  • Gebe mir alles, was zwischen <node /> liegt.
  • Sollte "/>" nicht existieren, dann gib mir alles, was zwischen <node></node> liegt.
  • Gib mir alles, was zwischen <way></way> liegt.

Ich habe fast die Befürchtung, dass das Statement / die Statements so dermaßen komplex werden würde, dass es eigentlich gar nicht zu realisieren ist. Hat jemand ne Idee, wie ein entsprechendes Statement aussehen könnte?

mirage228 20. Apr 2009 20:54

Re: RegEx - Ich steig da nicht durch...
 
Code:
<node(.*)>((.*)</node>|)
Code:
<way>(.*)</way>
ungetestet, aber so in etwa sollte es gehen...
Edit: Untergruppen durch Klammersetzung erzeugt. Auf diese Gruppen (insbes. "(.*)") solltest Du im Match dann einzeln zugreifen können.

Viele Grüße

P.S.: Ich kann Dir noch den PCRE-Wrapper von Renato Mancuso als Alternative zur nativen TRexExpr Bibliothek empfehlen :)

Mithrandir 20. Apr 2009 21:13

Re: RegEx - Ich steig da nicht durch...
 
Hi mirage228,

Danke für deine Hilfe! :thumb:

Es gibt ja die TestApp von TRegExp, der markiert mir allerdings mit dem Node Beispiel alle Einträge vom ersten Node bis zum Ende. Soviel wollte ich eigentlich nicht haben. :gruebel: Dasselbe Verhalten ist bei "way" zu beobachten, wenn mehrere "<way></way>"-Tags hintereinander sind. Ich werde mal gucken, ob es sich mit der anderen Komponente auch so verhält..

Daniel 20. Apr 2009 21:17

Re: RegEx - Ich steig da nicht durch...
 
Wenn Dir die Komponente zu "gierig" erscheint, dann schaue mal, ob Du einen Schalter /g oder "greedy" (oder meinetwegen auch "ungreedy") findest. Mit diesem lässt sich i.A. steuern, ob der reguläre Ausdruck den kleinst- oder größtmöglichen Textfetzen matcht.

Real-TTX 20. Apr 2009 21:20

Re: RegEx - Ich steig da nicht durch...
 
Versuch mal anstelle dem Punkt im Ausdruck folgendes zu verwenden : [^\/]* bzw mit +

Gruß, Real-TTX

Mithrandir 20. Apr 2009 21:20

Re: RegEx - Ich steig da nicht durch...
 
Zitat:

Zitat von Daniel
Wenn Dir die Komponente zu "gierig" erscheint, dann schaue mal, ob Du einen Schalter /g oder "greedy" (oder meinetwegen auch "ungreedy") findest. Mit diesem lässt sich i.A. steuern, ob der reguläre Ausdruck den kleinst- oder größtmöglichen Textfetzen matcht.

Das war's in der Tat. :shock:

Darauf wäre ich wohl nicht selbst gekommen, danke. :thumb:

//Edit: @Real-TTX: Ich probiere das mal eben aus. Hab nämlich festgestellt, dass das bei dem Node-Problem keine Lösung gebracht hat... :(


//Edit2: Also:

Code:
<node[^\/]+>((.*)</node>|)
Liefert mir nur die Teile, in denen <node ...>...</node> vorkommt.

An die anderen Tags komme ich nicht. Wenn ich [^\/]+ in die Mitte setze, dann markiert er zwar den Teil <node...>, aber nicht mehr den Rest bis </node>...

Real-TTX 20. Apr 2009 22:00

Re: RegEx - Ich steig da nicht durch...
 
Könntest du vllt nochmal wiederholen mit welchen Ausdrücken du welche Ergebnisse willst? Dann könnte ich dir vllt helfen :)

Gruß, Real-TTX

Mithrandir 20. Apr 2009 22:14

Re: RegEx - Ich steig da nicht durch...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Klar:

Folgende Beispieldatei:

XML-Code:
  <node id="282585868" lat="54.333581" lon="10.0556521" user="seawolff" visible="true" timestamp="2009-04-02T21:15:25+01:00"/>
  <node id="282593609" lat="54.3312243" lon="10.0555973" user="seawolff" visible="true" timestamp="2008-08-01T00:45:03+01:00"/>
  <node id="282593610" lat="54.3316107" lon="10.0557792" user="seawolff" visible="true" timestamp="2009-04-02T21:16:44+01:00"/>
  <node id="282593995" lat="54.3278978" lon="10.0491929" user="seawolff" visible="true" timestamp="2009-04-02T21:14:24+01:00"/>
  <node id="286368454" lat="54.3226474" lon="10.051243" user="seawolff" visible="true" timestamp="2009-01-25T20:37:17+00:00"/>
  <node id="292850773" lat="54.3317324" lon="10.0547135" user="nhoffm" visible="true" timestamp="2008-09-01T13:13:18+01:00">
    <tag k="bicycle" v="yes"/>
    <tag k="barrier" v="bollard"/>
    <tag k="foot" v="yes"/>
  </node>
<node id="292850791" lat="54.3318193" lon="10.0547549" user="nhoffm" visible="true" timestamp="2008-09-01T13:13:18+01:00">
    <tag k="bicycle" v="yes"/>
    <tag k="barrier" v="bollard"/>
    <tag k="foot" v="yes"/>
  </node>
  <node id="293582482" lat="54.3319214" lon="10.0520824" user="seawolff" visible="true" timestamp="2009-04-02T21:15:24+01:00"/>
  <node id="293582589" lat="54.3342985" lon="10.0531553" user="seawolff" visible="true" timestamp="2009-04-02T21:15:19+01:00"/>
  <node id="293582667" lat="54.3339883" lon="10.0529922" user="seawolff" visible="true" timestamp="2009-04-02T21:15:19+01:00"/>
  <node id="298607138" lat="54.3338381" lon="10.0557731" user="seawolff" visible="true" timestamp="2009-04-02T21:15:23+01:00"/>
  <node id="298607389" lat="54.3328038" lon="10.0552722" user="seawolff" visible="true" timestamp="2009-01-19T19:48:07+00:00"/>
  <node id="303919302" lat="54.3311145" lon="10.0544303" user="seawolff" visible="true" timestamp="2009-01-19T19:48:07+00:00"/>
  <node id="303919466" lat="54.3316025" lon="10.0535381" user="desc" visible="true" timestamp="2008-10-15T23:05:19+01:00"/>
  <relation id="62763" visible="true" timestamp="2009-04-07T12:35:46+01:00" user="Nightdive">
    <member type="way" ref="21377255" role="outer"/>
    <member type="way" ref="29411574" role="outer"/>
    <member type="way" ref="29413066" role="outer"/>
    <member type="way" ref="32207757" role="outer"/>
    <tag k="name" v="Kiel, Landeshauptstadt"/>
    <tag k="de:amtlicher_gemeindeschluessel" v="01002"/>
    <tag k="source" v="http://wiki.openstreetmap.org/wiki/Import/Catalogue/Kreisgrenzen_Deutschland_2005"/>
    <tag k="admin_level" v="6"/>
    <tag k="created_by" v="Potlatch 0.10f"/>
    <tag k="type" v="multipolygon"/>
    <tag k="boundary" v="administrative"/>
  </relation>
  <way id="27667325" visible="true" timestamp="2008-10-11T23:32:10+01:00" user="desc">
    <nd ref="303856920"/>
    <nd ref="303856922"/>
    <nd ref="303856923"/>
    <nd ref="303856924"/>
    <nd ref="303856925"/>
    <nd ref="303856927"/>
    <nd ref="303856928"/>
    <nd ref="303856929"/>
    <tag k="created_by" v="Potlatch 0.10d"/>
    <tag k="name" v="Helsinkistraße"/>
    <tag k="maxspeed" v="30"/>
    <tag k="highway" v="residential"/>
  </way>
  <way id="27667325" visible="true" timestamp="2008-10-11T23:32:10+01:00" user="desc">
Los gehts:

Code:
<node(.*)>((.*)</node>|)
Liefert mir

XML-Code:
  <node id="282585868" lat="54.333581" lon="10.0556521" user="seawolff" visible="true" timestamp="2009-04-02T21:15:25+01:00"/>
  <node id="282593609" lat="54.3312243" lon="10.0555973" user="seawolff" visible="true" timestamp="2008-08-01T00:45:03+01:00"/>
  <node id="282593610" lat="54.3316107" lon="10.0557792" user="seawolff" visible="true" timestamp="2009-04-02T21:16:44+01:00"/>
  <node id="282593995" lat="54.3278978" lon="10.0491929" user="seawolff" visible="true" timestamp="2009-04-02T21:14:24+01:00"/>
  <node id="286368454" lat="54.3226474" lon="10.051243" user="seawolff" visible="true" timestamp="2009-01-25T20:37:17+00:00"/>
  <node id="292850773" lat="54.3317324" lon="10.0547135" user="nhoffm" visible="true" timestamp="2008-09-01T13:13:18+01:00">
    <tag k="bicycle" v="yes"/>
    <tag k="barrier" v="bollard"/>
    <tag k="foot" v="yes"/>
  </node>
Code:
<node(.*)>([^\/]*</node>|)
liefert mir jeweils immer nur eine Zeile, also bspw.
XML-Code:
  <node id="282593995" lat="54.3278978" lon="10.0491929" user="seawolff" visible="true" timestamp="2009-04-02T21:14:24+01:00"/>
  <node id="286368454" lat="54.3226474" lon="10.051243" user="seawolff" visible="true" timestamp="2009-01-25T20:37:17+00:00"/>
  <node id="292850773" lat="54.3317324" lon="10.0547135" user="nhoffm" visible="true" timestamp="2008-09-01T13:13:18+01:00">
ungeachtet dem </node>-Tag.

Code:
<node[^\/]*>((.*)</node>|)
liefert mir
XML-Code:
  <node id="292850773" lat="54.3317324" lon="10.0547135" user="nhoffm" visible="true" timestamp="2008-09-01T13:13:18+01:00">
    <tag k="bicycle" v="yes"/>
    <tag k="barrier" v="bollard"/>
    <tag k="foot" v="yes"/>
  </node>
und schließlich liefert mir noch

Code:
<node[^\/]*>([^\/]*</node>|)
den vorherigen Ausschnitt, allerdings nur die Zeile

XML-Code:
  <node id="292850773" lat="54.3317324" lon="10.0547135" user="nhoffm" visible="true" timestamp="2008-09-01T13:13:18+01:00">
Überprüfen tue ich das alles mit der Testapp aus dem TRegExpr-Paket, siehe Anhang. Dabei sind die Optionen (/i) und (/s) gesetzt.

Real-TTX 20. Apr 2009 22:22

Re: RegEx - Ich steig da nicht durch...
 
Der erste Ausdruck soll wirklich nur das liefern ?

Warum nicht das hier :
Code:
<node id="282585868" lat="54.333581" lon="10.0556521" user="seawolff" visible="true" timestamp="2009-04-02T21:15:25+01:00"/>
  <node id="282593609" lat="54.3312243" lon="10.0555973" user="seawolff" visible="true" timestamp="2008-08-01T00:45:03+01:00"/>
  <node id="282593610" lat="54.3316107" lon="10.0557792" user="seawolff" visible="true" timestamp="2009-04-02T21:16:44+01:00"/>
  <node id="282593995" lat="54.3278978" lon="10.0491929" user="seawolff" visible="true" timestamp="2009-04-02T21:14:24+01:00"/>
  <node id="286368454" lat="54.3226474" lon="10.051243" user="seawolff" visible="true" timestamp="2009-01-25T20:37:17+00:00"/>
  <node id="292850773" lat="54.3317324" lon="10.0547135" user="nhoffm" visible="true" timestamp="2008-09-01T13:13:18+01:00">
    <tag k="bicycle" v="yes"/>
    <tag k="barrier" v="bollard"/>
    <tag k="foot" v="yes"/>
  </node>
<node id="292850791" lat="54.3318193" lon="10.0547549" user="nhoffm" visible="true" timestamp="2008-09-01T13:13:18+01:00">
    <tag k="bicycle" v="yes"/>
    <tag k="barrier" v="bollard"/>
    <tag k="foot" v="yes"/>
  </node>


Was ist der Unterschied zwischen :

Code:
<node id="282585868" lat="54.333581" lon="10.0556521" user="seawolff" visible="true" timestamp="2009-04-02T21:15:25+01:00"/>
  <node id="282593609" lat="54.3312243" lon="10.0555973" user="seawolff" visible="true" timestamp="2008-08-01T00:45:03+01:00"/>
  <node id="282593610" lat="54.3316107" lon="10.0557792" user="seawolff" visible="true" timestamp="2009-04-02T21:16:44+01:00"/>
  <node id="282593995" lat="54.3278978" lon="10.0491929" user="seawolff" visible="true" timestamp="2009-04-02T21:14:24+01:00"/>
  <node id="286368454" lat="54.3226474" lon="10.051243" user="seawolff" visible="true" timestamp="2009-01-25T20:37:17+00:00"/>
  <node id="292850773" lat="54.3317324" lon="10.0547135" user="nhoffm" visible="true" timestamp="2008-09-01T13:13:18+01:00"> <---- Hier ist das Problem
    <tag k="bicycle" v="yes"/>
    <tag k="barrier" v="bollard"/>
    <tag k="foot" v="yes"/>
  </node>
und

Code:
<node id="292850791" lat="54.3318193" lon="10.0547549" user="nhoffm" visible="true" timestamp="2008-09-01T13:13:18+01:00">    <---- Hier ist das Problem
    <tag k="bicycle" v="yes"/>
    <tag k="barrier" v="bollard"/>
    <tag k="foot" v="yes"/>
  </node>
So wie ich das verstehe willst du nur den oberen Block bei
Code:
<node(.*)>((.*)</node>|)
ist doch richtig, oder ?

Mithrandir 20. Apr 2009 22:29

Re: RegEx - Ich steig da nicht durch...
 
Öhm... Also, ich möchte eigentlich alles zwischen <node ... /> und <node></node> haben, und zwar für alle Vorkommnisse. Ich hatte jetzt immer nur die erste Query ausgeführt. Nicht gut?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 Uhr.
Seite 1 von 2  1 2      

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