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.
dater
Beiträge: 43
Registriert: 14.01.2006 15:22

StringReplace

Beitrag von dater »

Hallo,
ich habe ein 'StringReplace' benötigt, und habe eins erstellt was es so noch nicht gibt. Groß-Klein schreibung unabhängig und mehrfach ersetzen.

Wenn ihr noch ideen zur verbesserung habt, lasst es mich wissen!
Dater.

Code

Code: Alles auswählen


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

Procedure.s StringReplace(text.s,such.s,ersetz.s)
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+32)=b.b Or (a.b-32)=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
			Goto weiter				; 
		EndIf
		Break
	Else
		te=0
	EndIf
	Next t
Next s
	ProcedureReturn text.s
EndProcedure

;z.B.
A$="Es ist am Sontag immer so schon."
b$="o"
c$="oe"
;Debug StringReplace(a$,b$,c$)

; Space 
b$=" "
c$=""
A$="Es ist am Sontag immer so schön."
;Debug StringReplace(a$,b$,c$)

;Groß-Klein schreibung 
A$="Es ist am Sontag immer so schön."
b$="SONTAG"
c$="Montag"
;Debug StringReplace(a$,b$,c$)

Code

:allright:
Zuletzt geändert von dater am 30.04.2007 10:57, insgesamt 3-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: StringReplace

Beitrag von Kiffi »

dater hat geschrieben:Wenn ihr noch ideen zur verbesserung habt, lasst es mich wissen!
einen Verbesserungsvorschlag hätte ich da schon: Bitte Code-Tags setzen :-)

Grüße ... Kiffi
a²+b²=mc²
dater
Beiträge: 43
Registriert: 14.01.2006 15:22

CodeTags ?

Beitrag von dater »

Hi,
was meinst du mit CodeTags ?
Dater
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: CodeTags ?

Beitrag von Kiffi »

dater hat geschrieben:Hi,
was meinst du mit CodeTags ?
Dater
Dein Code wird in Deinem Beitrag nicht als solcher dargestellt, sondern
nur als normaler Text. Damit werden dann auch die Einrückungen (sofern
vorhanden) nicht dargestellt. Um das zu verhindern, musst Du Deinen
Code in sogenannte Code-Tags klammern. Das sieht dann beim Verfassen
einer Mitteilung wie folgt aus:

[ code]
; hier ist Dein Code
[ /code]

(ohne die Leerzeichen nach den geöffneten eckigen Klammern)

und nach dem Posten sieht das so aus:

Code: Alles auswählen

 ; hier ist Dein Code
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Hallo!

Ich finde deine Idee interessant, aber mehrfache Ersetzung gibt es doch schon?
Eine IDee zur Verbesserung habe ich: Wenn du dich schon so weit auskennst, würde ich an deiner Stelle mit Pointern arbeiten, das macht deine Prozedur um ein Vielfaches schneller.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ChristianK
Beiträge: 77
Registriert: 13.12.2004 14:55

Beitrag von ChristianK »

Ich würde es einfach so lasse.Dann bleibt es übersichtlich.Man muss ja nicht davon ausgehen das er einen handgetakteten Computer hat
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Nun, wenn ich Zeit habe, kann ich ja vielleicht mal ne 2. Variante davon basteln.

dater hat wirklich gute Arbeit geleistet, indem ich nun einen 2. Code basteln will, soll das nicht heißen, ich missbillige seinen Code. Im Gegenteil, ich will nur helfen, ihn zu verbessern.

Übrigens kann man auch Code mit Pointern übersichtlich gestalten, deshalb verstehe ich dieses Argument von dir nicht so ganz.

Ich weiß, die Computer sind sehr schnell. Trotzdem: Es kann ja mal sein, dass jemand einen Code wie den von dater braucht, um tausende Strings zu ersetzen.
Beispielrechnung:
Dater braucht ca. 700 ms, um einen String zu ersetzen.
1 000 x 700 ms = 700 000 ms = 700 s = 11,5 Minuten (stimmt das so? :oops: )
Sagen wir, meine Procedure bräuchte nur 175 ms, dann:
1 000 x 175 ms = 175 000 ms = 175 s = 3 Minuten

Das ist doch ein ganz schöner Unterschied, nicht?


@ dater:
Ich hätte noch eine Idee für deinen Code: Mach doch mal, dass man per Parameter entscheiden kann, ob man groß- und kleinschreibung berücksichtigen möchte!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ChristianK
Beiträge: 77
Registriert: 13.12.2004 14:55

Beitrag von ChristianK »

mal abgesehen davon daß deine Werte um Faktor 1000 zu hoch sind: Die natur benötigte 4500 Millionen jahre um den Menschen auf der Erde wandeln zu lassen. Was sind da ein paar sekunden <)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich sage ja nicht, dass man von nun an auf Performance achten muss. Es bleibt jedem selbst ünerlassen, wie er programmiert.

Ungeachtet meiner Rechnung: Stell dir mal vor, ich programmiere einen HTTP-Webserver und muss Ein- und Ausgaben formatieren. Da kommt es wirklich darauf an, dass man Zeit spart, denn der Client möchte die Daten möglichst schnell empfangen.

Oder du gehst rekursiv die Festplatte durch, auf der Suche nach bestimmten Dateien. Schon mit einfachen Tricks kann man die Dauer spürbar verkürzen!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

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

Beitrag von AND51 »

Frage: Wie unterbinde ich beim Poken, dass eine abschließende Null angehängt wird?

So weit bin ich schon:

Code: Alles auswählen

EnableExplicit

Procedure.s StringRePlace(String.s, Suche$, Ersetze$, kleinschreibung=0)
	Protected lenSuche=Len(Suche$)
	Protected lenErsetze=Len(Ersetze$)
	Protected *pos.Character=@String
	If lenSuche = lenErsetze
		While *pos\c
			If Not CompareMemoryString(*pos, @Suche$, kleinschreibung, lenSuche)
				PokeS(*pos, Ersetze$+PeekS(*pos+lenErsetze)) ; ZU UMSTÄNDLICH
			EndIf
			*pos+SizeOf(Character)
		Wend
		ProcedureReturn String
	EndIf
EndProcedure

Debug StringRePlace("Anna und Johanna", "an", "BB", 1)
Besonderheit: Wenn Such- und Ersatz-String die gleiche Länge haben, kann man die Arbeit nochmals beschleunigen.



@ dater: mir ist aufgefallen, dass ReplaceString() bereits CaseInSensivität unterstützt!! Es macht also alles, was dein Code auch kann!


Wir brauchen also keine neue Procedure. :)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten