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


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