Page 1 of 1

String functions

Posted: Tue Jan 19, 2021 1:46 am
by AZJIO

Code: Select all

EnableExplicit

Macro TrimLeft(String, n)
	Right(String, Len(String) - n)
EndMacro

Macro TrimRight(String, n)
	Left(String, Len(String) - n)
EndMacro

; Procedure.s TrimLeft(String$, n)
;    ProcedureReturn Right(String$, Len(String$) - n)
; EndProcedure

; Procedure.s TrimRight(String$, n)
;    ProcedureReturn Left(String$, Len(String$) - n)
; EndProcedure

Procedure FindFromEnd(String$, Find$)
	Protected Offset, Pos
	Repeat ; можно не бесконечный цикл на всякий случай
		Offset = FindString(String$ , Find$, Offset+1) ; Поиск последней
		If Not Offset								   ; если не найдено то выпрыгиваем, оставляя Pos с последним найденным
			Break
		EndIf
		Pos = Offset
	ForEver
	ProcedureReturn Pos
EndProcedure

Procedure FindFromEnd2(String$, Find$)
	Protected Pos
	Pos = FindString(ReverseString(String$) , ReverseString(Find$)) ; Поиск последней
	If Pos
		Pos = Len(String$) - Pos - Len(Find$) + 2
	EndIf
	ProcedureReturn Pos
EndProcedure

Procedure.s TrimLeftToFind(String$, Find$)
	Protected Pos
	Pos = FindString(String$ , Find$)
	If Pos
		ProcedureReturn Right(String$, Len(String$) - Pos - Len(Find$) + 1)
	EndIf
EndProcedure

Procedure.s TrimRightToFind(String$, Find$) ; удалить, найдено краткая запись, см ниже
	Protected Offset, Pos
	Repeat ; не бесконечный цикл на всякий случай
		Offset = FindString(String$ , Find$, Offset+1) ; Поиск последней
		If Not Offset								   ; если не найдено то выпрыгиваем, оставляя Pos с последним найденным
			Break
		EndIf
		Pos = Offset
	ForEver
	ProcedureReturn Left(String$, Pos - 1)
EndProcedure

Procedure.s TrimRightToFind2(String$, Find$)
	Protected Pos
	Pos = FindString(ReverseString(String$), ReverseString(Find$))
	If Pos
		ProcedureReturn Left(String$, Len(String$) - Pos - Len(Find$) + 1)
	EndIf
EndProcedure

; https://www.purebasic.fr/english/viewtopic.php?p=586876#p586876
Procedure.s FindBetween(String$, DelimStart$, DelimEnd$,  IsCase = #PB_String_CaseSensitive)
	Protected Pos, Pos2
	Pos = FindString(String$ , DelimStart$, 1,  IsCase)
	If Pos
		Pos + Len(DelimStart$)
		Pos2 = FindString(String$ , DelimEnd$, Pos,  IsCase)
		If Pos2
			ProcedureReturn Mid(String$, Pos, Pos2 - Pos)
		EndIf
	EndIf
EndProcedure

MessageRequester("Trim n characters to the left", TrimLeft("characters", 2))
MessageRequester("Trim n characters to the right", TrimRight("characters", 2))
MessageRequester("Search from the end", Str(FindFromEnd("Search from the end", "ro")))
MessageRequester("Search from the end", Str(FindFromEnd2("Search from the end", "ro")))
MessageRequester("Trimming from the beginning including the found", TrimLeftToFind("Trimming from the beginning including the found", "lud"))
MessageRequester("Trimming from the end including found", TrimRightToFind("Trimming from the end including found", "lud"))
MessageRequester("Trimming from the end including found", TrimRightToFind2("Trimming from the end including found", "lud"))
MessageRequester("Find between", FindBetween("Driver xvz (v1.2) 00", "xvz (v", ")"))

Re: String functions

Posted: Tue Jan 19, 2021 10:15 am
by STARGÅTE
You post in "Coding Questions". So what is the question?

Btw. Pure Basic has already functions like your TakeRight and TakeLeft, the names are Left() and Right() which you use yourself some lines below :?