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


SplitListByWords

Разделяет строку захватывая только целые слова.

SplitListByWords(*c.Character, List StringList.s())

Параметры

*c.Character Указатель на строку
StringList.s() Заранее созданный список (будет очищен перед использованием), являющийся результатом работы функции.

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

ничего

Примечания

Передавая указатель исключает копирование строки, но при этом оригинальная строка будет модифицирована. Поэтому если важно не испортить оригинальную строку, надо либо изменить функцию передавая строку и получив указатели, либо сделать копию строки перед тем как передать в функцию. Также это сделано как пример захвата с определённым набором символов и этот набор можно изменить по своему усмотрению, например захватывать только числа или только русские слова.

См. также

SplitL2

Пример

; AZJIO
; https://www.purebasic.fr/english/viewtopic.php?p=608408#p608408
Procedure SplitListByWords(*c.Character, List StringList.s())
    Protected *S.Integer
    *S = *c

    ClearList(StringList())

    If *c = 0 Or *c\c = 0
        ProcedureReturn 0
    EndIf

    While *c\c

        If Not ((*c\c >= 'a' And *c\c <= 'z') Or (*c\c >= 'A' And *c\c <= 'Z') Or *c\c = 39) ; '
            *c\c = 0
            If *S <> *c
                AddElement(StringList())
                StringList() = PeekS(*S)
                ; StringList() = PeekS(*S, (*c - *S) >> 1)
            EndIf
            *S = *c + SizeOf(Character)
        EndIf

        *c + SizeOf(Character)
    Wend
    *c - SizeOf(Character)
    If ((*c\c >= 'a' And *c\c <= 'z') Or (*c\c >= 'A' And *c\c <= 'Z'))
        AddElement(StringList())
        StringList() = PeekS(*S)
    EndIf
EndProcedure

Define S.s = "This is a test string ,#@%^ to .?<>\ see if split are working."
; Define S.s = " This "
Define NewList MyStrings.s()

; the variable will be modified after the function call
SplitListByWords(@S, MyStrings())

ForEach MyStrings()
    Debug "|" + MyStrings() + "|"
Next