AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein RegEx - Ich steig da nicht durch...
Thema durchsuchen
Ansicht
Themen-Optionen

RegEx - Ich steig da nicht durch...

Ein Thema von Mithrandir · begonnen am 20. Apr 2009 · letzter Beitrag vom 21. Apr 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#1

RegEx - Ich steig da nicht durch...

  Alt 20. Apr 2009, 20:47
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?
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

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

  Alt 20. Apr 2009, 21:54
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#3

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

  Alt 20. Apr 2009, 22:13
Hi mirage228,

Danke für deine Hilfe!

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. 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..
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 20. Apr 2009, 22:17
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#5

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

  Alt 20. Apr 2009, 22:20
Versuch mal anstelle dem Punkt im Ausdruck folgendes zu verwenden : [^\/]* bzw mit +

Gruß, Real-TTX
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#6

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

  Alt 20. Apr 2009, 22:20
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.

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

//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>...
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#7

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

  Alt 20. Apr 2009, 23:00
Könntest du vllt nochmal wiederholen mit welchen Ausdrücken du welche Ergebnisse willst? Dann könnte ich dir vllt helfen

Gruß, Real-TTX
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#8

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

  Alt 20. Apr 2009, 23:14
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

  <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.
Angehängte Dateien
Dateityp: exe testrexp_390.exe (461,0 KB, 2x aufgerufen)
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#9

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

  Alt 20. Apr 2009, 23:22
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#10

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

  Alt 20. Apr 2009, 23:29
Ö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?
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:27 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