Seite 1 von 1

RegEx Frage [gelöst]

Verfasst: 25.08.2008 00:22
von dater
Hi,
ich versuche mir RegEx zu Matchen. Also im String steht
"12 VW 13 (AUDI) 14 BMW"
nun will ich mit ExtractRegularExpression String zerlegen.

in Result$(1) soll 'VW' stehen.
in Result$(2) soll 'AUDI' stehen.
in Result$(3) soll 'BMW' stehen.

Code: Alles auswählen


DIM result$(0)
anz_marken = ExtractRegularExpression(0, "12 VW 13 (AUDI) 14 BMW", Result$())

Dater...

Verfasst: 25.08.2008 00:26
von edel
Versuch es mit Mid(), ansonsten gib doch bitte mehr Informationen.

RegEx Match

Verfasst: 25.08.2008 09:20
von dater
Hi,
ich versuche herauszukriegen wie ich mit ExtractRegularExpression 'gematchte' bereiche ($1 $2 $3 u.s.w) abspeichern kann!

--> (\b).*(\(*\))
--> print(10,10,"hallo")
== TRUE

jetz Sollte z.B. Print nach $1
und (10,10.) nach $2

und ich Suche eine Möglichkeit mit RegEx zu Zahlen !
(AAA|BBB|CCC|DDD|EEE)CCC 'gematched' CCC wurde an der 3. Stelle gefunden.
Ich brauch die 3 als Ergebnis.

Nach den vielen Beispielen im Internet sollte eigentlich das Funktionieren.
match$="(\d+)-(\d+)-(\d+)"
String$="12-31-1901"
$1=12
$2=31
$3=1901

Aber mit PureBasic bekomme ich es einfach nicht hin !

Dater....

Verfasst: 25.08.2008 10:37
von edel
Das liegt daran das es mit Purebasic nicht geht. Aber such im Forum mal
nach regex, da gibt es 1,2 Beispiele wie man Substrings mit pcre ausliest.

Verfasst: 25.08.2008 11:25
von ZeHa
Doch das müßte schon gehen, bin zwar kein Regex-Experte, aber da in Deinem Beispiel immer eine Zahl kommt und danach der gesuchte String, der unter Umständen eingeklammert ist, müßte sich damit eine Regex basteln lassen, die "String nach Zahl, umgeben von Leerzeichen und möglicherweise eingeklammert" findet und extrahiert.

Aber wie gesagt, kenne mich da nicht so gut damit aus. Und es könnte sein daß dann immer die Zahl mit angegeben wird, dann müßte man in den temporär extrahierten Strings (also "12 VW", "13 (AUDI)" und "14 BMW") einfach nochmal 'ne Regex ausführen, die nur Text findet, also Zahlen und Sonderzeichen ignoriert, diese gibt Dir dann letztendlich nur noch "VW", "AUDI" und "BMW".

Verfasst: 25.08.2008 12:23
von edel
ZeHa hat geschrieben:Doch das müßte schon gehen, bin zwar kein Regex-Experte, aber da in Deinem Beispiel immer eine Zahl kommt und danach der gesuchte String, der unter Umständen eingeklammert ist, müßte sich damit eine Regex basteln lassen, die "String nach Zahl, umgeben von Leerzeichen und möglicherweise eingeklammert" findet und extrahiert.

Aber wie gesagt, kenne mich da nicht so gut damit aus. Und es könnte sein daß dann immer die Zahl mit angegeben wird, dann müßte man in den temporär extrahierten Strings (also "12 VW", "13 (AUDI)" und "14 BMW") einfach nochmal 'ne Regex ausführen, die nur Text findet, also Zahlen und Sonderzeichen ignoriert, diese gibt Dir dann letztendlich nur noch "VW", "AUDI" und "BMW".
Du kannst immer nur einen String bekommen, im Fall des Datum muesste
man nur "\d+" schreiben um alle Zahlen extra auslesen zu koennen, nur
dann darf da auch nichts anderes mehr stehen, was regex recht sinnlos macht.
Genauso sinnlos ist es erst einen Teilstring auszulesen und ihn dann
nocheinmal durchlaufen lassen.


Beispiel :

PB :

Code: Alles auswählen

subject.s = "12-31-1901 31"+#LF$+"10-12-1914 12"
pattern.s = "(\d+)-(\d+)-(\d+)"

If CreateRegularExpression(0, pattern)
  Dim Result$(0)
  NbFound = ExtractRegularExpression(0, subject, Result$())
  For k = 0 To NbFound-1
    Debug Result$(k)
  Next
Else
  Debug RegularExpressionError()
EndIf

Code: Alles auswählen

subject.s = "12-31-1901 31"+#LF$+"10-12-1914 12"
pattern.s = "\d+"

If CreateRegularExpression(0, pattern)
  Dim Result$(0)
  NbFound = ExtractRegularExpression(0, subject, Result$())
  For k = 0 To NbFound-1
    Debug Result$(k)
  Next
Else
  Debug RegularExpressionError()
EndIf
Beide liefern kein ausreichendes Ergebnis .


bemueht man dagegen PCRE selber, sieht das dann in etwa so aus:

Code: Alles auswählen

ImportC ""
  pcre_exec(*pcre, *extra, subject.s, length, startoffset, options, *ovector, ovecsize)
  pcre_get_substring(subject.s, *ovector, stringcount, stringnumber, *stringptr)
  pcre_free_substring(*stringptr)
EndImport

subject.s = "12-31-1901 31"+#LF$+"10-12-1914 12"
pattern.s = "(\d+)-(\d+)-(\d+)"
len = Len(subject)

Dim ovec(30)

regex = CreateRegularExpression(#PB_Any, pattern)

While pcre_exec(PeekL(regex), 0, subject, len, offset, 0, @ovec(), 30)>0
  
;   Debug PeekS(@subject + ovec(2),ovec(3)-ovec(2)) ; 2 start offset first sub  - 3 end offset 
;   Debug PeekS(@subject + ovec(4),ovec(5)-ovec(4)) ; 4 start offset second sub - 5 end offset
;   Debug PeekS(@subject + ovec(6),ovec(7)-ovec(6)) ; 6 start offset third sub  - 7 end offset 
;   Debug "-----"
  
  pcre_get_substring(subject, ovec(), len, 1, @stringptr) ; first sub
  Debug PeekS(stringptr)
  pcre_free_substring(stringptr)
  
  pcre_get_substring(subject, ovec(), len, 2, @stringptr)
  Debug PeekS(stringptr)
  pcre_free_substring(stringptr)
  
  pcre_get_substring(subject, ovec(), len, 3, @stringptr)
  Debug PeekS(stringptr)
  pcre_free_substring(stringptr)
  
  Debug "-----"
    
  offset = ovec(1)
Wend 


und hier nochmal mit dem Auto:

Code: Alles auswählen

subject.s = "12 VW 13 (AUDI) 14 BMW"
pattern.s = "([a-z]+)"

If CreateRegularExpression(0, pattern,1)
  Dim Result$(0)
  NbFound = ExtractRegularExpression(0, subject, Result$())
  For k = 0 To NbFound-1
    Debug Result$(k)
  Next
Else
  Debug RegularExpressionError()
EndIf

Verfasst: 25.08.2008 12:57
von ZeHa
Wieso denn nicht?

Ich kann doch, wenn ich den Beispielstring habe (12 VW 13 (AUDI) 14 BMW), ein Pattern das etwa sagt "zweistellige Zahl, Leerzeichen, zusammenhängende Buchstaben und vielleicht auch Klammern" anwenden. Dann bekomme ich doch "12 VW", beim nächsten Versuch "13 (AUDI)" und schließlich "14 BMW", oder nicht? Und von diesen dann mit einer weiteren Regex die Zahl und die Klammern wegzuwerfen dürfte dann doch auch kein Problem mehr sein.

(Wie gesagt, ich kenn mich nicht aus, aber für ersteres müßte doch ein Pattern reichen, das ungefähr so aussieht: "[0-9][0-9] [A-Z()]*").

Verfasst: 25.08.2008 13:23
von edel
Ja, das mag ja fuer den einen oder anderen kein Thema sein. Aber
warum sollte man denn nicht gleich den Substring auslesen koennen?
Das ist doch eine grosse Staerke von PCRE bzw regulaeren Ausdruecken.
Und wenn man schon mehr als einen Ausdruck schreiben muss, dann kann
man es auch gleich selber, mit Hilfe der Stringbefehle machen.

danke

Verfasst: 25.08.2008 15:16
von dater
Danke für die ausführliche Antwort, dann werde ich auf PCRE Basic mein RegEx durchführen, eine kleine Procedure sollte das erledigen können, eine kleines Beispiel habe ich ja hier .. Danke..

Noch eine Frage ...

Was macht ImportC"" (Importieren aber was ?)

und was bedeutet
pcre_exec(*pcre, *extra, subject.s, length, startoffset, options, *ovector, ovecsize) diese Zeile.