Описание функции
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