Grep Routine ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Grep Routine ?

Beitrag von TWELVE »

Komisch, habe gerade mal den wesentlichen Code außerhalb meiner Applikation getestet und da liefert Regex
bei jedem Aufruf einen Match.

Code: Alles auswählen

Enumeration
   #RegularExpression
EndEnumeration

Global Lines

Declare.s GrepText(logcontent.s, greptext.s)

; Logdatei erzeugen

logcontent.s + "Das ist eine Logzeile Test1"+#CRLF$
logcontent.s + "Das ist eine Logzeile Test2"+#CRLF$
logcontent.s + "Das ist eine Logzeile Test3"+#CRLF$  
logcontent.s + "Das ist eine Logzeile Test4"+#CRLF$
logcontent.s + "Das ist eine Logzeile Test2 Test4"+#CRLF$

Lines = CountString(logcontent.s, #CRLF$)


; Strings in Logdatei suchen

Debug GrepText(logcontent.s, "Test1")
Debug GrepText(logcontent.s, "Test2")
Debug GrepText(logcontent.s, "Test3")
Debug GrepText(logcontent.s, "Test4")



Procedure.s GrepText(logcontent.s, greptext.s)
  ; returns all lines in logcontent.s that contain the string in greptext.s
  
   
GrepStartTime = ElapsedMilliseconds()   
   

*Buffer = AllocateMemory(7000000)
  *Pointer = *Buffer


If CreateRegularExpression(#RegularExpression, ".*"+greptext.s+".*")
  If ExamineRegularExpression(#RegularExpression, logcontent.s)
       While NextRegularExpressionMatch(#RegularExpression)
          CopyMemoryString(RegularExpressionMatchString(#RegularExpression), @*Pointer)
          match+1
       Wend
   EndIf
EndIf 
 
 grepline.s = PeekS(*Buffer)

 ElapsedTime.d = ElapsedMilliseconds()-GrepStartTime 
   
 ElapsedTime.d = ElapsedTime.d/1000
   
 Debug "Grep process took "+ElapsedTime.d+" seconds to find "+match+" Matches in "+lines+" Lines"  
 
 FreeRegularExpression(#RegularExpression)
 
 FreeMemory(*Buffer)
 
 ProcedureReturn grepline.s  
   
EndProcedure  
In meinem Code mache ich das genauso, da findet Regex dann aber nach dem ersten Aufruf von GrepText() dann nichts mehr.
Innerhalb von GrepText() habe ich mit Debug geprüft, ob die beiden Strings ( logcontent.s, greptext.s) den korrekten Inhal
haben und dies ist der Fall.Erster Aufruf bringt immer korrektes Ergebnis und bei allen weiteren Aufrufen findet Regex
dann keine Übereinstimmung mehr, obwohl diese gefunden wird, wenn es die erste Suche ist.

Edit:

Ich habs gefunden :-) Da war - wie immer - ein Denkfehler drin und ich hab dann wohl nicht so genau hingesehen.
Ich lade logcontent.s aus dem EditorGadget, aber das Ergebnis aus GrepText wird dann wieder ins EditorGadget geladen.
Bei erneutem Aufruf ist das Logfile also bereits durch die erste Suche gefiltert und somit kann dann auch nichts mehr
gefunden werden.


__________________________________________________
Quote-Tags>Code-Tags
11.03.2017
RSBasic
Antworten