Regular Expression

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Regular Expression

Beitrag 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?
pb 4.51
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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
pb 4.51
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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
pb 4.51
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
Zuletzt geändert von STARGÅTE am 09.07.2010 16:09, insgesamt 1-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Re: Regular Expression

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten