RegEx Frage [gelöst]

Anfängerfragen zum Programmieren mit PureBasic.
dater
Beiträge: 43
Registriert: 14.01.2006 15:22

RegEx Frage [gelöst]

Beitrag 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...
Zuletzt geändert von dater am 25.08.2008 16:27, insgesamt 1-mal geändert.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Versuch es mit Mid(), ansonsten gib doch bitte mehr Informationen.
dater
Beiträge: 43
Registriert: 14.01.2006 15:22

RegEx Match

Beitrag 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....
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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".
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Zuletzt geändert von edel am 25.08.2008 13:10, insgesamt 2-mal geändert.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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()]*").
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
dater
Beiträge: 43
Registriert: 14.01.2006 15:22

danke

Beitrag 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.
Antworten