String-Funktionen

Du brauchst Grafiken, gute Programme oder Leute die dir helfen? Frag hier.
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

String-Funktionen

Beitrag von Leonhard »

Code: Alles auswählen

; Wie FindString, nur das dir Position angegeben wird, wo der String zum FindStringAnzahl-Male auftritt
; Bsp:
; Debug FindStringEx("Du bist Boris !!! Oder etwa nicht ?", " ", 1, 2)
; ; DerRückgabewert sollte 3 sein
Procedure.l FindStringEx(String$, StringToFind$, StartPosition, FindStringAnzahl)
	Protected Pos
	Pos = StartPosition
	For S1=1 To FindStringAnzahl
		If FindString(String$, StringToFind$, Pos)
			Pos + FindString(String$, StringToFind$, Pos) - Pos
		Else
			Pos = 0
			Break
		EndIf
	Next
	ProcedureReturn Pos
EndProcedure

; Fügt an der gegebenen Position den Patch$ in den String$ ein. Alle danach kommenden Zeichen werden überschrieben.
Procedure.s PatchString(String$, Pos, Patch$)
	ProcedureReturn Left(String$, Pos)+Patch$+Right(String$, Len(String$)-Pos-Len(Patch$))
EndProcedure

; Fügt an der gegebenen Position den Pach$ in den String$ ein. Alle danach kommenden Zeichen werden angehängt.
Procedure.s AddString(String$, Pos, Add$)
	ProcedureReturn Left(String$, Pos)+Add$+Right(String$, Len(String$)-Pos)
EndProcedure

;{ TrimEx
;/ Syntax:
; 	TrimEx(String$, Zeichen.c = ' ', Mode = #XTC_TrimEx_Mode_Mid)
;/ Aenliche Befehle:
; 	Trim(...) ;/ PB-Standart-Befehl seit Version 3.20 (9. Juni 2002)
;/ Beschreibung:
; 	Entfernt alle Zeichen des in Parameter Zeichen.c (standart ' ' bzw.
; 	Leerzeicehn) angegebenen Zeichen am wahlweise rechten, linken oder
; 	rechts und links.
;/ Parameter:
; 	String$
; 		Der String, an dem das Zeichen (Parameter Zeichen.c = ' ') an den
; 		Rändern abgeschnitten wurde.
; 	Zeichen.c = ' '
; 		Das Zeichen, das am Rechten, linken oder rechten und linken Rand
; 		abgeschnitten werden soll.
; 	Mode(.b oder Enumertation 'XTC_TrimEx_Mode_*') = #XTC_TrimEx_Mode_Mid
; 		Der Modus des Abschneidens. Kann folgende angaben haben:
CompilerIf Defined(XTC_TrimEx_Mode_Mid, #PB_Constant) = #False; Or Defined(XTC_TrimEx_Mode_Left, #PB_Constant) = #False Or Defined(XTC_TrimEx_Mode_Right, #PB_Constant) = #False
	Enumeration -1 ; XTC_TrimEx_Mode_*
		#XTC_TrimEx_Mode_Mid   ; Das Zeichen (Parameter Zeichen.c = ' ') wird am linken und rechten Rand abgeschnitten (standart)
		#XTC_TrimEx_Mode_Left  ; Das Zeichen (Parameter Zeichen.c = ' ') wird am linken             Rand abgeschnitten
		#XTC_TrimEx_Mode_Right ; Das Zeichen (Parameter Zeichen.c = ' ') wird am            rechten Rand abgeschnitten
	EndEnumeration
CompilerEndIf
;/ Rueckgabewert(.s oder $):
; 	Gibt den String bearbeitet zurück.
Procedure$ TrimEx(String$, Zeichen.c = ' ', Mode.b = #XTC_TrimEx_Mode_Mid)
	Protected S1.l
	If Mode = #XTC_TrimEx_Mode_Left ; Left (vorne) abschneiden
		For S1 = 1 To Len(String$)
			If Left(String$,1) = Chr(Zeichen)
				String$ = Right(String$, Len(String$) -1)
			EndIf
		Next
	ElseIf Mode = #XTC_TrimEx_Mode_Right ; Right (hinten) abschneiden
		For S1 = 1 To Len(String$)
			If Right(String$,1) = Chr(Zeichen)
				String$ = Left(String$, Len(String$) -1)
			EndIf
		Next
	Else;If Mode = #XTC_TrimEx_Mode_Mid ; Left (vorne) und Right (hinten) abschneiden
		For S1 = 1 To Len(String$)
			If Left(String$,1) = Chr(Zeichen)
				String$ = Right(String$, Len(String$) -1)
			EndIf
		Next
		For S1 = 1 To Len(String$)
			If Right(String$,1) = Chr(Zeichen)
				String$ = Left(String$, Len(String$) -1)
			EndIf
		Next
	EndIf
	
	ProcedureReturn String$
EndProcedure

;/ Anwendungsbeispiel
;Debug TrimEx("-----Text-String------",'-',#XTC_TrimEx_Mode_Left)
;Debug TrimEx("-----Text-String------",'-',#XTC_TrimEx_Mode_Right)
;Debug TrimEx("-----Text-String------",'-')
;}

; Wie FindString. Nur genauer mit einer angabe. (wird für StringFieldEx(...) benötigt)
Procedure.l FindCountString(String$, FindString$, Anz, StartFrom = 1)
	Protected l1.l
	Anz-1
	For l1=1 To Anz
		StartFrom = FindString(String$, FindString$, StartFrom+Len(FindString$))
	Next
	ProcedureReturn StartFrom
EndProcedure

; ReplaceString verbessert
Macro ReplaceString(String, StringToFind, StringToReplace, Mode = #False, StartFrom = 1)
	ReplaceStringEx(String, StringToFind, StringToReplace, Mode, StartFrom)
EndMacro
Procedure.s ReplaceStringEx(String$, StringToFind$, StringToReplace$, Mode.b = #False, StartFrom = 1)
	While FindString(String$, StringToFind$, StartFrom)
		String$=Left(String$, FindString(String$, StringToFind$, StartFrom)-1)+StringToReplace$+Right(String$, Len(String$)-FindString(String$, StringToFind$, StartFrom)-1+Len(StringToFind$))
		StartFrom=FindString(String$, StringToFind$, StartFrom)-1+Len(StringToFind$)
	Wend
	ProcedureReturn String$
EndProcedure

; Wie StringField(...) nur kann längere Seperatoren verwenden.
Macro StringField(String, Index, Seperator)
	StringFieldEx(String, Index, Seperator)
EndMacro
Procedure.s StringFieldEx(String$, Index, Seperator$)
	String$+Seperator$
	String$ = Mid(String$, FindCountString(String$, Seperator$, Index), FindCountString(String$, Seperator$, Index+1)-FindCountString(String$, Seperator$, Index))
	If Not Index=1
		String$ = Right(String$, Len(String$)-Len(Seperator$))
	EndIf
	ProcedureReturn String$
EndProcedure
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von Thorsten1867 »

Wenn ich die Beschreibung richtig verstanden habe, müsste die Procedure nicht wie folgt lauten?

Code: Alles auswählen

Procedure.l FindStringEx(String$, StringToFind$, StartPosition, FindStringAnzahl) 
  Protected Pos
  For S1=1 To FindStringAnzahl
    Pos = FindString(String$, StringToFind$, StartPosition)
    If Pos
      StartPosition = Pos + 1
    Else 
      Break 
    EndIf 
  Next 
  ProcedureReturn Pos
EndProcedure

String$ = "Das ist ein Test"
Debug FindStringEx(String$, " ", 1, 3)
=> Das 3. Leerzeichen befindet sich an Position 12.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

Uuups :oops:
danke für den hinweis.
Antworten