RegExp Zeile für Zeile

Anfängerfragen zum Programmieren mit PureBasic.
Marie23
Beiträge: 49
Registriert: 31.05.2008 18:14

RegExp Zeile für Zeile

Beitrag 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
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

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

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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

Marie23
Beiträge: 49
Registriert: 31.05.2008 18:14

Beitrag 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?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag 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ß! ;)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
Marie23
Beiträge: 49
Registriert: 31.05.2008 18:14

Beitrag von Marie23 »

Danke Danilo!

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