Code archives/Algorithms/Alternate Replace command (2nd version)

This code has been declared by its author to be Public Domain code.

Download source code

Alternate Replace command (2nd version) by PowerPC6032004
The previous version had one flaw: it searched for an occurance of the "Find$"-string, replaced it with the "Replace$"-string
and started searching again on the new string (with the replacement).

Some results were strange:
SourceString$ = "This is a string where "is" must be replaced"
FindString$ = "is"
ReplaceString$ = "his"
NumOfOcc% = 2

Result: "Thhhis is a string where "is" must be replaced"

The routine replace the first "is" with "his" -> "Thhis is a string where "is" must be replaced"
Then it restarted from the start, where it would again find "is" in the first word "Thhis" -> "Thhhis is a string where "is" must be replaced"

So, in short, these strange results were only noticable when the "FindString$" ( = "is") is a part of the "ReplaceString$" (= "his").

This new version finds the positions of the occurances in the "SourceString$" before replacing them.
When all occurances have been found, then the function recreates the entire string and replaces each occurance (as many as stated by the NumOfOcc-parameter).
There's also a built-in limit-protection, so you cannot state more occurances than there are present in the string.

If you take the above example, then you see that there are only 3 occurances of the "FindString$" ("is").
If you call the routine like this:
Print NewReplace$(SourceString$, FindString$, ReplaceString$, 20)

Then the routine automatically limits the NumOfOcc% internally to 3.
Graphics 800, 600, 0, 2

StringToSearch$ = Input$("Enter Source-String: ")
StringToFind$ = Input$("Enter Find$-string: ")
StringToReplace$ = Input$("Enter Replace$-string: ")
NumOfOccurances% = Input$("Enter NumOfOcc%: ")

Print NewReplace$(StringToSearch$, StringToFind$, StringToReplace$, NumOfOccurances%)

WaitKey()



Dim OccPos%(0)
Function NewReplace$(SourceString$, OldString$, NewString$, NumOfOcc% = 0)
	Local TotalOcc%
	Local TargetString$

	Local Len_Source% = Len(SourceString$)
	Local Len_Old% = Len(OldString$)

	; Scan the entire string for each occurance and count them
	For i = 1 To ((Len_Source% - Len_Old%) + 1)
		If Mid$(SourceString$, i, Len_Old%) = OldString$ Then
			TotalOcc% = TotalOcc% + 1
		EndIf
	Next

	; Set maximum occurances (in case user stated more than present)
	If NumOfOcc% > TotalOcc% Then NumOfOcc% = TotalOcc%

	; Redim the array to hold the positions of all required occurances
	Dim OccPos(NumOfOcc%)

	; Create the new "TargetString$"
	If NumOfOcc% = 0 Then
		Return Replace$(SourceString$, OldString$, NewString$)
	Else
		; Find the positions of all occurances of the "OldString$" in the "SourceString$"
		For i = 1 To NumOfOcc%
			; Find the position of each occurance
			If i = 1 Then
				OccPos(i) = Instr(SourceString$, OldString$)
			Else
				OccPos(i) = Instr(SourceString$, OldString$, OccPos(i-1) + Len_Old%)
			EndIf
		Next

		; Create the new string
		; Copy the part before the first occurance to the "TargetString$"
		TargetString$ = Mid$(SourceString$, 1, OccPos(1) - 1)

		; Copy the "NewString$" for all but one of the occurances and the chars between each occurance
		For i = 1 To NumOfOcc% - 1
			If OccPos(i) <> 0 Then
				TargetString$ = TargetString$ + NewString$
				TargetString$ = TargetString$ + Mid$(SourceString$, OccPos(i) + Len_Old%, OccPos(i + 1) - (OccPos(i) + Len_Old%))
			EndIf
		Next

		; Copy the "NewString$" for the last occurance and the remaining part of the "SourceString$"
		If OccPos(NumOfOcc%) <> 0 Then
			TargetString$ = TargetString$ + NewString$
			TargetString$ = TargetString$ + Mid$(SourceString$, OccPos(NumOfOcc%) + Len_Old%)
		EndIf

		Return TargetString$
	EndIf
End Function

Comments

None.

Code Archives Forum