Funktion, die Platzhalter ("*" und "?") in String prüft ?

Anfängerfragen zum Programmieren mit PureBasic.
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Funktion, die Platzhalter ("*" und "?") in String prüft

Beitrag von c4s »

@STARGÅTE
Ich habe noch einen kleinen Fehler gefunden:

Code: Alles auswählen

Debug ReplacePattern("test", "test*", "X")  ; Gibt "test" aus anstatt "X"
(Unter Verwendung von: http://www.purebasic.fr/german/viewtopi ... 23#p293723 und ReplacePattern() aus http://www.purebasic.fr/german/viewtopi ... 06#p293606)
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Funktion, die Platzhalter ("*" und "?") in String prüft

Beitrag von STARGÅTE »

Jo, bestätig, ich hatte das nicht mehr drinne (* am Ende) weil es ja vorher nur ums Finden ging, und da sind * am ende egal, beim Ersetzen jedoch nicht, da du ja alles was mit "test" anfängt ersetzen willst.

Werd mich mal nach dem verlängerten Wochenende damit befassen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Funktion, die Platzhalter ("*" und "?") in String prüft

Beitrag von c4s »

STARGÅTE hat geschrieben:Werd mich mal nach dem verlängerten Wochenende damit befassen.
Danke!
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Funktion, die Platzhalter ("*" und "?") in String prüft

Beitrag von STARGÅTE »

So, müsste nun funktionieren, ich hoffe nur, dass jetzt nicht wieder eine andere Variante fehlschlägt.
Ich habe zusätzlich noch die DataSection entfernt und durch LCase ersetzt.
Das ist natürlich langsammer aber halt Unicodekompatibel.
(wusste garnicht, dass LCase("Δ") wirklich δ zurück gibt)

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!", "!*", "+-+")
Edit: Bug-Fix
Zuletzt geändert von STARGÅTE am 03.10.2011 13:27, insgesamt 2-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Funktion, die Platzhalter ("*" und "?") in String prüft

Beitrag von c4s »

Danke schonmal. Aber folgendes geht immer noch nicht und ein weitere Fehler ist nun auch hinzugekommen:

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)
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Funktion, die Platzhalter ("*" und "?") in String prüft

Beitrag von STARGÅTE »

:oops: peinlich, peinlich.

Habe meinen Beitrag editiert, hatte eine +1 zu viel ^^ und eine Zeile zu viel.
Sollte nun gehen.
Aber ich wette fast du findest weitere Fehler :lol: , aber ist ja nicht schlimm, nur so wirds bugfrei :allright:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Funktion, die Platzhalter ("*" und "?") in String prüft

Beitrag von c4s »

STARGÅTE hat geschrieben:Aber ich wette fast du findest weitere Fehler :lol: , aber ist ja nicht schlimm, nur so wirds bugfrei :allright:
Ja, hab da noch etwas auf Lager mit "**" :wink:

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
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Funktion, die Platzhalter ("*" und "?") in String prüft

Beitrag von GPI »

Gerade was gefunden:

http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Windows liefert da eine Routine für :)

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")
Funktioniert wie es soll.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Funktion, die Platzhalter ("*" und "?") in String prüft

Beitrag von c4s »

@GPI
Danke für den Tipp.

Ich bin aber mit STARGÅTEs Funktion ganz zufrieden... vor allem weil es Potential zum erweitern hat und z.B. bereits "#" (für nur eine Zahl) unterstützt. Und es ist natürlich Plattformunabhängig!
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Funktion, die Platzhalter ("*" und "?") in String prüft

Beitrag von GPI »

du mußt halt aufpassen - ich hab keine Ahnung, ob * und ? in Linux reservierte Zeichen sind oder nicht tatsächlich auch als Dateinamen benutzt werden dürfen.

Hier hast du mit # schon das Problem, dass das Zeichen sehr wohl in einen Namen vorkommen kann, da es nicht verboten ist.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Antworten