Описание функции


TrimCharsToString

Удаляет повтор указанных символов в строке.

TrimCharsToString(String.s, ReplaceString.s = " ", FindChars.s = " ")

Параметры

String.s Строка для обработки
ReplaceString.s Строка чем будет заменено. По умолчанию заменена на пробелы
FindChars.s Строка содержащая символы, каждый из которых будет заменён. По умолчанию будут заменены повторы пробелов

Возвращаемое значение

Возвращает обработанную строку.

См. также

LTrimChar, RTrimChar

Пример

EnableExplicit

; https://www.purebasic.fr/english/viewtopic.php?p=588707#p588707

;-TOP by mk-soft, v1.03.3, 30.08.2022

Procedure.s TrimCharsToString(String.s, ReplaceString.s = " ", FindChars.s = " ")
    ; DisableDebugger

    Protected result.s, firstFound, found, size_max, size_replace
    Protected *result, *findChars, *c.Character, *fc.Character, *rc.character, *tc.character, *ofs

    If Not Bool(String)
        ProcedureReturn ""
    EndIf

    size_max = StringByteLength(String) + SizeOf(Character)
    size_replace = StringByteLength(ReplaceString)

    *result = AllocateMemory(size_max + size_replace * 4, #PB_Memory_NoClear)
    *rc = *result
    *c = @String
    *tc = @ReplaceString
    *findChars = @FindChars

    While *c\c
        *fc = *findChars
        While *fc\c
            If *c\c = *fc\c
                If Not firstFound
                    firstFound = #True
                    If *tc\c
                        CopyMemory(*tc, *rc, size_replace)
                        *rc + size_replace
                        If *rc - *result >= size_max
                            *ofs = *rc - *result
                            size_max = MemorySize(*result)
                            *result = ReAllocateMemory(*result, size_max + size_replace * 4, #PB_Memory_NoClear)
                            *rc = *result + *ofs
                        EndIf
                    EndIf
                EndIf
                found = #True
                Break
            EndIf
            *fc + SizeOf(Character)
        Wend

        If Not found
            If firstFound : firstFound = #False : EndIf
            *rc\c = *c\c
            *rc + SizeOf(character)
        Else
            found = #False
        EndIf
        *c + SizeOf(Character)
    Wend

    *rc\c = 0
    result = PeekS(*result)
    FreeMemory(*result)
    ProcedureReturn result
EndProcedure

CompilerIf #PB_Compiler_IsMainFile
    Define String$
    String$ =" " + #CRLF$ + #CRLF$ + " Hello World! " + #LFCR$ + #TAB$ + " "
    MessageRequester("до", "|" + String$ + "|")
    String$=TrimCharsToString(String$, " ", #CR$ + #LF$ + #TAB$ + " ")
    MessageRequester("после", "|" + String$ + "|")
CompilerEndIf