Nach langen hin und her habe ich nun eine neue funktionsfähige Version.
l zu finden.
Das ist nun "abgeschaltet". Das heißt, die Prozedur geht nun
möglichkeiten durch.
Hinweis an die nutzer: Mit bedacht das * einsetzten. (*** wird aber zu * gekürtzt)
Der Code arbeitet nun so wie du wolltest, die Tests waren bisher alle erfolgreich.
Code: Alles auswählen
Structure CharacterArray
c.c[0]
EndStructure
Global *LowCaseCharacter.CharacterArray = ?LowCaseCharacter
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 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 *LowCaseCharacter\c[*String\c[StringIndex+PatternIndex]] <> *LowCaseCharacter\c[*Pattern\c[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
DataSection
LowCaseCharacter:
Data.c $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0A, $0B, $0C, $0D, $0E, $0F
Data.c $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $1A, $1B, $1C, $1D, $1E, $1F
Data.c $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $2A, $2B, $2C, $2D, $2E, $2F
Data.c $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $3A, $3B, $3C, $3D, $3E, $3F
Data.c $40, $61, $62, $63, $64, $65, $66, $67, $68, $69, $6A, $6B, $6C, $6D, $6E, $6F
Data.c $70, $71, $72, $73, $74, $75, $76, $77, $78, $79, $7A, $5B, $5C, $5D, $5E, $5F
Data.c $60, $61, $62, $63, $64, $65, $66, $67, $68, $69, $6A, $6B, $6C, $6D, $6E, $6F
Data.c $70, $71, $72, $73, $74, $75, $76, $77, $78, $79, $7A, $7B, $7C, $7D, $7E, $7F
Data.c $80, $81, $82, $83, $84, $85, $86, $87, $88, $89, $9A, $8B, $9C, $8D, $9E, $8F
Data.c $90, $91, $92, $93, $94, $95, $96, $97, $98, $99, $9A, $9B, $9C, $9D, $9E, $FF
Data.c $A0, $A1, $A2, $A3, $A4, $A5, $A6, $A7, $A8, $A9, $AA, $AB, $AC, $AD, $AE, $AF
Data.c $B0, $B1, $B2, $B3, $B4, $B5, $B6, $B7, $B8, $B9, $BA, $BB, $BC, $BD, $BE, $BF
Data.c $E0, $E1, $E2, $E3, $E4, $E5, $E6, $E7, $E8, $E9, $EA, $EB, $EC, $ED, $EE, $EF
Data.c $F0, $F1, $F2, $F3, $F4, $F5, $F6, $D7, $F8, $F9, $FA, $FB, $FC, $FD, $FE, $DF
Data.c $E0, $E1, $E2, $E3, $E4, $E5, $E6, $E7, $E8, $E9, $EA, $EB, $EC, $ED, $EE, $EF
Data.c $F0, $F1, $F2, $F3, $F4, $F5, $F6, $F7, $F8, $F9, $FA, $FB, $FC, $FD, $FE, $FF
EndDataSection
Procedure StringPatternMatch(String.s, Pattern.s)
Protected Position, FoundLength
Protected Result = #False
Position = Pattern_Find(@String, @Pattern, @FoundLength)
If Position = 1 And FoundLength = Len(String)
ProcedureReturn #True
EndIf
EndProcedure
;- Beispiel
Debug StringPatternMatch("Beispiel123.exe", "*.*")
Debug StringPatternMatch("Beispiel123.exe", "?*?")
Debug StringPatternMatch("Beispiel123.exe", "?ei*###.*")
Debug StringPatternMatch("Beispiel123.exe", "*.?*")