![]() |
RegEx - Ich steig da nicht durch...
Hi ihr,
als Folge aus ![]() Ich hatte dunkel im Kopf, dass es für Delphi eine RegEx-Implementation gab, und, tadaa, ich hab sie auch ![]() 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 ![]() ![]() Dabei möchte ich eigentlich nur folgendes:
XML-Code:
Wie man sieht, gibt es eigentlich drei Möglichkeiten:
<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>
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:
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? |
Re: RegEx - Ich steig da nicht durch...
Code:
<node(.*)>((.*)</node>|)
Code:
ungetestet, aber so in etwa sollte es gehen...
<way>(.*)</way>
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 ![]() |
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.. |
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.
|
Re: RegEx - Ich steig da nicht durch...
Versuch mal anstelle dem Punkt im Ausdruck folgendes zu verwenden : [^\/]* bzw mit +
Gruß, Real-TTX |
Re: RegEx - Ich steig da nicht durch...
Zitat:
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:
Liefert mir nur die Teile, in denen <node ...>...</node> vorkommt.
<node[^\/]+>((.*)</node>|)
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>... |
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 |
Re: RegEx - Ich steig da nicht durch...
Liste der Anhänge anzeigen (Anzahl: 1)
Klar:
Folgende Beispieldatei:
XML-Code:
Los gehts:
<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">
Code:
Liefert mir
<node(.*)>((.*)</node>|)
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:
liefert mir jeweils immer nur eine Zeile, also bspw.
<node(.*)>([^\/]*</node>|)
XML-Code:
ungeachtet dem </node>-Tag.
<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">
Code:
liefert mir
<node[^\/]*>((.*)</node>|)
XML-Code:
und schließlich liefert mir noch
<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:
den vorherigen Ausschnitt, allerdings nur die Zeile
<node[^\/]*>([^\/]*</node>|)
XML-Code:
Überprüfen tue ich das alles mit der Testapp aus dem TRegExpr-Paket, siehe Anhang. Dabei sind die Optionen (/i) und (/s) gesetzt.
<node id="292850773" lat="54.3317324" lon="10.0547135" user="nhoffm" visible="true" timestamp="2008-09-01T13:13:18+01:00">
|
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:
und
<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>
Code:
So wie ich das verstehe willst du nur den oberen Block bei
<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>
Code:
ist doch richtig, oder ?
<node(.*)>((.*)</node>|)
|
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 03:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz