StringReplace

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Friedhelm
Beiträge: 43
Registriert: 29.08.2004 08:50

Beitrag von Friedhelm »

AND51 hat geschrieben:Frage: Wie unterbinde ich beim Poken, dass eine abschließende Null angehängt wird?
CopyMemory()

Syntax

CopyMemory(*SourceMemoryID, *DestinationMemoryID, Laenge)
Beschreibung

Kopiert einen Speicherbereich von '*SourceMemoryID' (der Ausgangs-Speicheradresse) mit der angegebenen Länge (in Bytes) zur '*DestinationMemoryID' (der Ziel-Speicheradresse).

Wenn sich Ausgangs- und Zielspeicherbereich überlappen, ist es sicherer, MoveMemory() zu verwenden, andernfalls kann das Ergebnis falsch sein.
Unterstützte OS
mfg
Friedhelm
dater
Beiträge: 43
Registriert: 14.01.2006 15:22

StringReplace Teil 2

Beitrag von dater »

Hallo,
ich habe mein "StringReplace" etwas erweitert.
Weiter funktionen kommen noch. Aber aus zeitgründen dauert es noch etwas.
Wer will, kann den Code ändern und hier Posten.

Code: Alles auswählen


; StringReplace 30.04.2007 Markus Maiwald
; (fast so gut wie das von AHK)

; StringReplace(text.s,such.s,ersetz.s,anzahl,grosklein.b)
; text.s		=Text der durchsucht wird  
; such.s		=Suchtext
; ersetz.s   	=Text der durch den Suchtext ersetzt werden soll
; anzahl.l		=Anzahl der ersetzungen  ( 0 = alles )
; grosklein.b	=  0 => Ohne Groß-Klein unterscheidung  
; großklein.b 	=  1 => 1 : 1 erkennungn  

Procedure.s StringReplace(text.s,such.s,ersetz.s,anzahl,grosklein.b)
If grosklein=0 : gk.b=32 : Else : gk.b=0 : EndIf
l=Len(text.s) : l2=Len(such.s) : te=0 : start=1
weiter:
For s=start To l							; loop text
	a.b=Asc(Mid(text.s,s,1))				; asc Zeichen Text
	For t=1 To l2						; loop suchtext
	b.b=Asc(Mid(such.s,t+te,1))			; asc Zeichen Suchtext
	If a.b=b.b Or (a.b+gk.b)=b.b Or (a.b-gk.b)=b.b; Groß Klein Schreibung aufheben.
		te=te+1						; Anzahl der Treffer 
		If te=l2						; Anzahl der Treffer mit Anzahl der SuchZeichen vergleichen 
			ok=ok+1					; Anzahl der gfunden Texte die ersetzt wurden.
			text1.s=Left(text.s,s-l2)		; Linke Textseite
			text2.s=Right(text.s,l-s)		; Rechte Textseite
			text.s=text1.s+ersetz.s+text2.s	; Text zusammen setzen
			l=Len(text.s)				; Neue Text Länge
			start=s-l2+(Len(ersetz.s))+1	; Neuer Start berechnen.		
			te=0						; Treffer auf null
			If anzahl=ok
				Goto ende
			Else
				Goto weiter				; 
			EndIf
		EndIf
		Break
	Else
		te=0
	EndIf
	Next t
Next s
ende:
	ProcedureReturn text.s
EndProcedure

;z.B.
A$="Heute wird am 1.Mai gefeiert."
b$="1.Mai"
c$="18.Mai"
Debug a$
a$=StringReplace(a$,b$,c$,0,1)
Debug a$
a$=StringReplace(a$,"Mai","Juni",0,1)
Debug a$
a$=StringReplace(a$,"gefeiert","gefressen",0,1)
Debug a$
a$=StringReplace(a$,"e","E",2,0)
Debug a$

dater
Beiträge: 43
Registriert: 14.01.2006 15:22

StringReplace

Beitrag von dater »

Hi,
ich habe den Code etwas optimiert, das Goto ist weg und Define wurde hinzugefügt.

Code: Alles auswählen


; StringReplace 30.04.2007 Markus Maiwald
; (fast so gut wie das von AHK)

; StringReplace(text.s,such.s,ersetz.s,anzahl,grosklein.b)
; text.s		=Text der durchsucht wird  
; such.s		=Suchtext
; ersetz.s   	=Text der durch den Suchtext ersetzt werden soll
; anzahl.l		=Anzahl der ersetzungen  ( 0 = alles )
; grosklein.b	=  0 => Ohne Groß-Klein unterscheidung  
; großklein.b 	=  1 => 1 : 1 erkennungn  


Procedure.s StringReplace(text.s,such.s,ersetz.s,anzahl,grosklein.b)
Define.l	l,l2,te,start,s,anzahl,ok,t 
Define.b	grosklein,gk,a,b
Define.s 	text,text1,text2
If grosklein=0 : gk.b=32 : Else : gk.b=0 : EndIf
l=Len(text.s) : l2=Len(such.s) : te=0 : start=1 : s=0
Repeat
	a.b=Asc(Mid(text.s,s,1))				; asc Zeichen Text
	For t=1 To l2						; loop suchtext
	b.b=Asc(Mid(such.s,t+te,1))			; asc Zeichen Suchtext
	If a.b=b.b Or (a.b+gk.b)=b.b Or (a.b-gk.b)=b.b; Groß Klein Schreibung aufheben.
		te=te+1						; Anzahl der Treffer 
		If te=l2						; Anzahl der Treffer mit Anzahl der SuchZeichen vergleichen 
			ok=ok+1					; Anzahl der gfunden Texte die ersetzt wurden.
			text1.s=Left(text.s,s-l2)		; Linke Textseite
			text2.s=Right(text.s,l-s)		; Rechte Textseite
			text.s=text1.s+ersetz.s+text2.s	; Text zusammen setzen
			l=Len(text.s)				; Neue Text Länge
			start=s-l2+(Len(ersetz.s))+1	; Neuer Start berechnen.		
			te=0						; Treffer auf null
			If anzahl=ok
				Break
			Else
				Continue	
			EndIf
		EndIf
		Break
	Else
		te=0
	EndIf
	Next t
	s=s+1
Until s>l
	ProcedureReturn text.s
EndProcedure

Define.s a$,b$,c$
;z.B.
A$="Heute wird am 1.Mai gefeiert."
b$="1.Mai"
c$="18.Mai"
Debug a$
a$=StringReplace(a$,b$,c$,0,1)
Debug a$
a$=StringReplace(a$,"Mai","Juni",0,1)
Debug a$
a$=StringReplace(a$,"gefeiert","gefressen",0,1)
Debug a$
a$=StringReplace(a$,"e","E",2,0)
Debug a$

Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Innerhalb von Proceduren sollte PROTECTED statt DEFINE verwendet werden.

Auch finde ich es schade, dass du auf meinen Hinweis keine Antwort gibst:
Ich sagte, dass ReplaceString() auch die Option bietet, Groß-/Kleinschreibung zu ignorieren.
Du meinst außerdem, es würde nur den ersten Strig ersetzen. Das stimmt nicht, es ersetzt alle Strings.

Du hast also das Rad unnötigerweise neu erfunden.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

bla bla bla ...

Schonmal daran gedacht dass das Verhalten von ReplaceString
nicht immer ideal ist ? Wer etwas anderes braucht kann z.B. hier
im ctt Forum nachgucken.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> bla bla bla ...
Soll das heißen, du stellst meine Hilfe in Frage? Das find ich aber nicht nett! /:->

> Schonmal daran gedacht dass das Verhalten von ReplaceString nicht immer ideal ist ?
In welchen Fällen denn zum Beispiel?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
dater
Beiträge: 43
Registriert: 14.01.2006 15:22

Änderung

Beitrag von dater »

Hi,
ich habe eure Bitten gelesen und werde die änderung durchführen.
Nur meine Zeit am Computer ist stark eingeschrenk.
Groß.Klein Schreibung ist drinne. last mir nich etwas Zeit.

Danke Dater...
Antworten