Seite 1 von 1

Regular Expression

Verfasst: 12.06.2009 17:56
von gnasen
Hi, ich bin selber nicht sehr begabt in RegExp und bräuchte einmal Hilfe bei einem Wahrscheinlich total trivialen Problem:

Ich möchte folgenden String matchen:

Code: Alles auswählen

<a>test</a><a>test2</a>
und nutze folgenden Pattern:

Code: Alles auswählen

<(\w+)>(.*)</\1>
Er matcht mir allerdings:
test</a><a>test2
ich möchte aber:
test und test2

Hat jemand eine Idee?

Verfasst: 12.06.2009 18:19
von STARGÅTE
.* bedeutet alles in beliebiger Länge, und RegExp arbeitet immer so:
Das größte zuerst!

Also machs so:

Code: Alles auswählen

<(\w+)>([^<>]*)</\1>
Du verhinderst du das er < oder > im match hat

Verfasst: 12.06.2009 18:33
von gnasen
das funktioniert schonmal ganz gut.
Als nächstes hakt es hier:

<a bla=test> blub <\a>

blub soll in der "Gruppe" a trotzdem noch gematch werden. Aber irgendwie mag das nicht.

Ich weiss nicht, wie ich das noch zusätzlich eingebaut bekommen soll, sodass der Match immer noch funktioniert.

Ich komme damit einfach nicht zurecht Danke schonmal soweit für die Hilfe

Verfasst: 12.06.2009 18:38
von STARGÅTE
naja da würde ich das ähnlich machen:

lasse nach einen Tag einfach jedes zeichen noch mal zu außer das >
Also das er <a...> zulässt ...

Code: Alles auswählen

<(\w+)[^>]*>([^<>]*)</\1> 
Nun hält er sich noch an die Tags (also das a am anfang und ende) aber was nach dem a innerhab der <> kommt ist ihm egal ...

PS: Diese Lösungen beruhen alle auf meiner Erfahrung, hab sie also nicht weiter getestet ... ich hoffe es geht ...

Ich hoffe als nächstet willst du nicht noch die Flags der Tags auslesen ^^

Verfasst: 12.06.2009 18:46
von gnasen
Ich hatte fast 1 zu 1 die Gleiche Idee, das Problem, sowohl deine als auch meine Lösung funktionieren nicht.

Der Matched die a Gruppe dann gar nicht mehr

Verfasst: 12.06.2009 18:58
von STARGÅTE
also in PB zB gehts:

Code: Alles auswählen

If CreateRegularExpression(0, "<(\w+)[^>]*>([^<>]*)</\1>")
 Dim Result$(0)
 NbFound = ExtractRegularExpression(0, "<a href='hier'>Laber</a><a>Laber2</a>", Result$())
 For k = 0 To NbFound-1
  Debug Result$(k)
 Next
Else
 Debug RegularExpressionError()
EndIf
Allerdingt kann ich mit PB ja leider nicht auf die Klammern alleine zugreifen ... aber Findent tut er es.
Also solltest du in PHP oder so, wo du ja ein Array bekommst mit den Feld 2 auf das innere zugreifen können ...

ansonsten schick mal das Codeausschnitt ...

Verfasst: 12.06.2009 19:34
von STARGÅTE
Habe eben noch in php was zusammen gebastelt:

http://data.unionbytes.de/preg.php

Gebe dort dein text oben ein:
<a href='hier'>Laber</a><a>Laber2</a>
und bei Pattern dann den "echten":

Code: Alles auswählen

~<(\w+)[^>]*>([^<>]*)</\1>~
Ich erhalte dabei:
1. Treffer
String : <a href='hier'>Laber</a>
- Teil 1 : a
- Teil 2 : Laber

2. Treffer
String : <a>Laber2</a>
- Teil 1 : a
- Teil 2 : Laber2

Re: Regular Expression

Verfasst: 12.06.2009 21:59
von AND51
gnasen hat geschrieben:Ich möchte folgenden String matchen:

Code: Alles auswählen

<a>test</a><a>test2</a>
ich möchte aber:
test und test2
STARGATE hat doch gesagt, RegExps nehmen "immer das größere zuerst", der Fachkundige nennt das auch "Gieriges Suchmuster" (von englisch "greedy pattern").

Stelle dem ganzen Ausdruck ein (?U) voran, um ein "genügsames Suchmuster" ("ungreedy pattern") zu erhalten.

Das Suchmuster hier matcht immer genau einen Link nach dem anderen:

Code: Alles auswählen

(?U)\<(a|A)(|\s.+)\>(.*)\</<(a|A)>
                    ----
                     |___________ Der Textinhalt des Links
Ungetestet, hab ich aus dem Kopf so hingeschrieben.
Dazu noch folgenden Tipp:
Um Substrings zu extrahieren musst du die RegExp-Funktionen irgendwie aus den PB-Libs importieren.
ich weiß, dass edel weiß, wie das geht, auswendig weiß ich das gerade nicht mehr.
Musst ihn mal fragen oder hier im Forum suchen.