Ich habe noch einen kleinen Fehler gefunden:
Code: Alles auswählen
Debug ReplacePattern("test", "test*", "X") ; Gibt "test" aus anstatt "X"
Code: Alles auswählen
Debug ReplacePattern("test", "test*", "X") ; Gibt "test" aus anstatt "X"
Danke!STARGÅTE hat geschrieben:Werd mich mal nach dem verlängerten Wochenende damit befassen.
Code: Alles auswählen
Structure CharacterArray
StructureUnion
c.c[0]
s.s{1}[0]
EndStructureUnion
EndStructure
Procedure Pattern_Find(*String.CharacterArray, *Pattern.CharacterArray, *FoundLength.Integer=#Null)
Protected StringIndex.i, PatternIndex.i, Position.i, TempPosition.i
Protected FoundLength.i, TempFoundLength.i, BestFoundLength.i
While *String\c[StringIndex]
Repeat
While *Pattern\c[PatternIndex]
Select *Pattern\c[PatternIndex]
Case '?' ; Platzhalter für genau ein Zeichen
If *String\c[StringIndex+PatternIndex] = ''
Break 2 ; Unpassend
EndIf
Case '#' ; Platzhalter für genau eine Zahl
If *String\c[StringIndex+PatternIndex] < '0' Or *String\c[StringIndex+PatternIndex] > '9'
Break 2 ; Unpassend
EndIf
Case '*' ; Platzhalter für eine beliebige Anzahl von Zeichen (auch keins)
While *Pattern\c[PatternIndex+1] = '*'
PatternIndex + 1
FoundLength + 1
Wend
Position = 0
BestFoundLength = 0
Repeat
TempPosition = Pattern_Find(@*String\c[StringIndex+PatternIndex+Position], @*Pattern\c[PatternIndex+1], @TempFoundLength)
TempFoundLength + FoundLength
Position + TempPosition
If *Pattern\c[PatternIndex+1] = '' And *String\c[StringIndex+PatternIndex] = ''
Break 1 ; Passend
ElseIf Not TempPosition
If BestFoundLength
FoundLength = BestFoundLength
Break 2 ; Passend
Else
Break 3 ; Unpassend
EndIf
Else
TempFoundLength + Position-1
If *Pattern\c[PatternIndex+1] = ''
While *String\c[StringIndex+TempFoundLength]
TempFoundLength + 1
Wend
EndIf
If TempFoundLength > BestFoundLength
BestFoundLength = TempFoundLength
EndIf
EndIf
ForEver
Default ; Beliebiges anderes Zeichen
If LCase(*String\s[StringIndex+PatternIndex]) <> LCase(*Pattern\s[PatternIndex])
Break 2 ; Unpassend
EndIf
EndSelect
PatternIndex + 1
FoundLength + 1
Wend
If *FoundLength
*FoundLength\i = FoundLength
EndIf
ProcedureReturn StringIndex+1
Until #True
PatternIndex = 0
StringIndex + 1
FoundLength = 0
Wend
EndProcedure
Procedure FindPattern(String.s, Pattern.s, StartPosition=1, *FoundLength.Integer=#Null)
Protected Result.i, *String.CharacterArray = @String
If Not Pattern
ProcedureReturn #Null
ElseIf StartPosition > Len(String)
ProcedureReturn #Null
ElseIf StartPosition > 1
Result = Pattern_Find(@*String\c[StartPosition-1], @Pattern, *FoundLength)
If Result
ProcedureReturn Result+StartPosition-1
Else
ProcedureReturn #Null
EndIf
Else
ProcedureReturn Pattern_Find(@*String\c[0], @Pattern, *FoundLength)
EndIf
EndProcedure
Procedure.s ReplacePattern(String.s, PatternToFind.s, StringToReplace.s)
Protected Position, FoundLength
Repeat
FoundLength = 0
Position = FindPattern(String, PatternToFind, Position, @FoundLength)
If Position
String = Left(String, Position-1)+Mid(String, Position+FoundLength)
If Position > Len(String)
String + StringToReplace
Else
String = InsertString(String, StringToReplace, Position)
EndIf
Position + Len(StringToReplace)
EndIf
Until Not Position
ProcedureReturn String
EndProcedure
Procedure Replace(String.s, Pattern.s, StringToReplace.s="")
Protected Text.s
Text + LSet(Chr(34)+String+Chr(34), 20)
Text + LSet(Chr(34)+Pattern+Chr(34),15)
Text + Chr(34)+ReplacePattern(String, Pattern, StringToReplace)+Chr(34)
Debug Text
EndProcedure
Replace("Hallo Welt!", "welt", "+-+")
Replace("Hallo Welt!", "?l", "+-+")
Replace("Hallo Welt!", "*l", "+-+")
Replace("Hallo Welt!", "!*", "+-+")
Code: Alles auswählen
Replace("abc", "c*", "X") ; Ergibt "abc" anstatt "abX" (siehe vorheriges Beispiel mit "test")
Replace("abc", "b*", "X") ; Ergibt "aXc" anstatt "aX" (Nur mit neuem Code!)
Replace("abc", "*???*", "X") ; Ergibt "abc" anstatt "X" (Neu entdeckt)
Ja, hab da noch etwas auf Lager mit "**"STARGÅTE hat geschrieben:Aber ich wette fast du findest weitere Fehler, aber ist ja nicht schlimm, nur so wirds bugfrei
Code: Alles auswählen
Replace("abc", "?**b", "X") ; Ergibt "abc" anstatt "Xc"
Replace("abc", "??**?", "X") ; Ergibt "aX" anstatt "X"
Replace("abc", "???**?", "X") ; Ergibt "X" anstatt "abc", dürfte nicht funktionieren
Code: Alles auswählen
Debug PathMatchSpec_("Hallo.txt","*.txt")
Debug PathMatchSpec_("Hallo.ess","*.txt")
Debug PathMatchSpec_("Hallo.mp3","*.txt;*.mp3")
Debug PathMatchSpec_("Hallo.txt","*.txt;*.mp3")
Debug PathMatchSpec_("Hallo.ess","*.txt;*.mp3")