Описание функции
SplitMapByWords
Разделяет строку захватывая только целые слова в одном экземпляре.
SplitMapByWords(*c.Character, Map StringMap.s(), CaseSensitive = 1)
Параметры
*c.Character | Указатель на строку |
StringMap.s() |
Заранее созданная карта (будет очищена перед использованием), являющийся результатом работы функции. |
CaseSensitive |
Учитывать ли регистр? |
Возвращаемое значение
ничего |
Примечания
Передавая указатель исключает копирование строки, но при этом оригинальная строка будет модифицирована. Поэтому если важно не испортить оригинальную строку, надо либо изменить функцию передавая строку и получив указатели, либо сделать копию строки перед тем как передать в функцию. Также это сделано как пример захвата с определённым набором символов и этот набор можно изменить по своему усмотрению, например захватывать только числа или только русские слова.См. также
SplitListByWords, SplitL2Пример
; AZJIO
; https://www.purebasic.fr/english/viewtopic.php?p=608430#p608430
EnableExplicit
Procedure SplitMapByWords(*c.Character, Map StringMap.s(), CaseSensitive = 1)
Protected *S.Character
*S = *c
ClearMap(StringMap())
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
If CaseSensitive
AddMapElement(StringMap(), PeekS(*S))
Else
AddMapElement(StringMap(), LCase(PeekS(*S)))
StringMap() = PeekS(*S)
EndIf
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'))
If CaseSensitive
AddMapElement(StringMap(), PeekS(*S))
Else
AddMapElement(StringMap(), LCase(PeekS(*S)))
StringMap() = PeekS(*S)
EndIf
EndIf
EndProcedure
Define S.s = "This is see see see is see see see is this"
Define NewMap MyStrings.s()
; the variable will be modified after the function call
SplitMapByWords(@S, MyStrings(), 0)
ForEach MyStrings()
Debug "|" + MapKey(MyStrings()) + "|"
Next