Seite 1 von 1

RegExp Zeile für Zeile

Verfasst: 16.06.2008 18:58
von Marie23
Hallo,

ich möchte folgendes:

Mein Programm liest z.B. folgende Datei ein:


test.txt Inhalt:

Code: Alles auswählen

hallo
hello
hillo
hollo
hullo
Und nun kommt meine RegExp und sowas wie explode(),keine Ahnung,was Zeile für Zeile testet, ob ein bestimmtes Muster vorhanden ist, und die Ausgabe anzeigt

Muster:

Code: Alles auswählen

h(.)llo
Ausgabe:

Code: Alles auswählen

a
e
i
o
u

Verfasst: 16.06.2008 23:31
von AND51
Bin schon zu müde und komme leider nicht auf ein funktionierendes Stück Code, rausgekommen ist bei mir nur das... :freak:

Code: Alles auswählen

hi.s="hallo"+#CRLF$+"hello"+#CRLF$+"hillo"+#CRLF$+"hollo"+#CRLF$+"hullo"

CreateRegularExpression(0, "(?im)^h.{1}llo")

; Wir müssen ein String-Array bereitstellen
Dim ausgabe.s(0)
n=ExtractRegularExpression(0, hi, ausgabe()) ; extrahiert alle Übereinstimmungen

; n enthält die Anzahl der Matches
For i=1 To n
	Debug ausgabe(i-1)
Next
Ich kenne zwar 'explode()' nicht, aber vermutlich bist du mit ExtractReglarExpression() gut beraten.

Vielleicht kann edel hier ja mal mitmischen?

Verfasst: 17.06.2008 01:44
von edel
Es gibt keine moeglichkeit mit pb befehlen, man kann aber
die api von pcre benutzen.

Code: Alles auswählen

IsRegularExpression(0) ; wird benoetigt um die lib einzubinden

ImportC ""
  pcre_compile(pattern.s,options,*errptr,*erroffset,*tableptr)
  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

pattern.s   = "h(.)ll(.)"
subject.s   = " hhlld"+#CRLF$+"hallu"+#CRLF$+"hlll "+#CRLF$+"hllld"+#CRLF$+"holla"
len         = Len(subject)
offset      = 0
error       = 0
erroffset   = 0

Dim ovec(30)

regex = pcre_compile(pattern,0,@error,@erroffset,0)

count = pcre_exec(regex,0,subject,len,offset,0,@ovec(),30)

If count < 0
  Debug PeekS(error) + " -> " + PeekS(@pattern + erroffset)
  End
EndIf

While count > 0
  
  pcre_get_substring(subject,ovec(),count,1,@first_sub)
  pcre_get_substring(subject,ovec(),count,2,@second_sub)
  
  offset = ovec(1)
  all.s  = PeekS(@subject + ovec(0),ovec(1)-ovec(0))
  all    + " ("
  all    + PeekS(first_sub)
  all    + ") ("
  all    + PeekS(second_sub)
  all    + ")"
  
  Debug all
  
  pcre_free_substring(first_sub)
  pcre_free_substring(second_sub)
  
  count = pcre_exec(regex,0,subject,len,offset,0,@ovec(),30)
Wend


Verfasst: 17.06.2008 07:25
von Marie23
edel hat geschrieben:Es gibt keine moeglichkeit mit pb befehlen, man kann aber
die api von pcre benutzen.
Da braucht man aber wieder eine extra DLL :/

Wie setze ich es denn mit PB Befehlen um?

Verfasst: 17.06.2008 07:39
von ts-soft
>> Da braucht man aber wieder eine extra DLL :/
Nein, es wird dieselbe statische Lib Importiert, wie PB es sowieso machen
würde, es wird lediglich statt des internen Wrappers von PB direkt die
API verwendet.

Verfasst: 17.06.2008 07:56
von Danilo
edel hat geschrieben:Es gibt keine moeglichkeit mit pb befehlen, man kann aber
die api von pcre benutzen.
Das was Marie23 machen möchte, ist doch auch mit PB-Befehlen
ganz leicht machbar:
(nicht vergessen, wir sind hier im *Anfänger*-Forum ;))

Code: Alles auswählen

Dim result$(0)

If Not CreateRegularExpression(0,"h(.)llo")
  Debug "Fehler: " + RegularExpressionError()
  End
EndIf

Restore Datei

Repeat
  Read line$ ; line$ = ReadString() um aus Datei zu lesen
  
  count = ExtractRegularExpression(0, line$, result$())
  If count
     For i = 0 To count-1
        match$ = Mid( result$(i), 2, 1 ) ; "h" und "llo" aus result$(i) entfernen
        Debug match$
     Next i
  EndIf
Until line$ = "" ; Until EOF

DataSection
  Datei:
    Data.s "hallo"
    Data.s "hello"
    Data.s "hillo"
    Data.s "hollo"
    Data.s "hullo"
    Data.s "h1llo h2llo h3llo h4llo"
    Data.s ""
EndDataSection
Auch Dein Beispiel ist so machbar:

Code: Alles auswählen

Dim result$(0)

If Not CreateRegularExpression(0,"h(.)ll(.)")
  Debug "Fehler: " + RegularExpressionError()
  End
EndIf

Restore Datei

Repeat
  Read line$ ; line$ = ReadString() um aus Datei zu lesen
  
  count = ExtractRegularExpression(0, line$, result$())
  If count
     For i = 0 To count-1
        match$ = result$(i)+" ("+Mid(result$(i),2,1)+") ("+Mid(result$(i),5,1)+")"
        Debug match$
     Next i
  EndIf
Until line$ = "" ; Until EOF

DataSection
  Datei:
    Data.s " hhlld", "hallu", "hlll ", "hllld", "holla"
    Data.s ""
EndDataSection
Die Position des gefunden Strings kann man auch ganz leicht
mit FindString(line$, result$(i), start_pos) bekommen, wenn man
es denn braucht.

@Marie23:
Schau Dir mal den ersten Code von mir hier an. Das umschreiben,
um die Zeilen aus einer Datei zu lesen, ist Deine Hausaufgabe.

Viel Spaß! ;)

Verfasst: 17.06.2008 15:19
von edel
Ich bezog mich auf die Substrings, und die kann man mit PB leider nicht
auslesen. In deinem Fall wuerde man so mit "h.llo" bzw "h.ll." auskommen.

Verfasst: 17.06.2008 15:23
von Marie23
Danke Danilo!

Hier kriegt man wirklich 1 A Hilfe, tolles Forum! :allright: