Seite 1 von 2

StringReplace

Verfasst: 30.04.2007 08:39
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:

Re: StringReplace

Verfasst: 30.04.2007 09:16
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

CodeTags ?

Verfasst: 30.04.2007 10:29
von dater
Hi,
was meinst du mit CodeTags ?
Dater

Re: CodeTags ?

Verfasst: 30.04.2007 10:43
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

Verfasst: 30.04.2007 12:01
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.

Verfasst: 30.04.2007 13:12
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

Verfasst: 30.04.2007 13:50
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!

Verfasst: 30.04.2007 14:27
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 <)

Verfasst: 30.04.2007 15:21
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!

Verfasst: 01.05.2007 02:47
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. :)