split-sequence
is the off-the-shelf solution.
you can also roll your own:
(defun my-split (string &key (delimiterp #'delimiterp))
(loop :for beg = (position-if-not delimiterp string)
:then (position-if-not delimiterp string :start (1+ end))
:for end = (and beg (position-if delimiterp string :start beg))
:when beg :collect (subseq string beg end)
:while end))
where delimiterp
checks whether you want to split on this character, e.g.
(defun delimiterp (c) (or (char= c #\Space) (char= c #\,)))
or
(defun delimiterp (c) (position c " ,.;/"))
PS. looking at your expected return value, you seem to want to call string-downcase
before my-split
.
PPS. you can easily modify my-split
to accept :start
, :end
, :delimiterp
&c.
PPPS. Sorry about bugs in the first two versions of my-split
. Please consider that an indicator that one should not roll one's own version of this function, but use the off-the-shelf solution.