ユーザー入力を取得してリストに保存しようとしています。単一の文字列で構成されるリストではなく、スキャンされた各Wordを独自の文字列にします。例:
> (input)
This is my input. Hopefully this works
戻ります:
("this" "is" "my" "input" "hopefully" "this" "works")
最終的なリストにスペースや句読点を入れたくないことに注意してください。
任意の入力をいただければ幸いです。
split-sequence
は既成のソリューションです。
自分でロールすることもできます。
(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))
ここで、delimiterp
は、この文字で分割するかどうかをチェックします。例:.
(defun delimiterp (c) (or (char= c #\Space) (char= c #\,)))
または
(defun delimiterp (c) (position c " ,.;/"))
PS。期待される戻り値を見ると、string-downcase
の前に my-split
を呼び出したいようです。
PPS。 my-split
を簡単に変更して、:start
、:end
、:delimiterp
&cを受け入れることができます。
PPPS。 my-split
の最初の2つのバージョンのバグについて申し訳ありません。この関数の独自のバージョンをロールするすべきではないという指標を考慮してください。ただし、既成のソリューションを使用してください。
Common-LISPでのそのタスクには、私は便利だと思いました(uiop:split-string str :separator " ")
およびパッケージuiop
には、一般に多くのユーティリティがあります。ドキュメントをご覧ください https://common-LISP.net/project/asdf/uiop.html#index -split_002dstring 。
cl-ppcre:split
があります:
* (split "\\s+" "foo bar baz
frob")
("foo" "bar" "baz" "frob")
* (split "\\s*" "foo bar baz")
("f" "o" "o" "b" "a" "r" "b" "a" "z")
* (split "(\\s+)" "foo bar baz")
("foo" "bar" "baz")
* (split "(\\s+)" "foo bar baz" :with-registers-p t)
("foo" " " "bar" " " "baz")
* (split "(\\s)(\\s*)" "foo bar baz" :with-registers-p t)
("foo" " " "" "bar" " " " " "baz")
* (split "(,)|(;)" "foo,bar;baz" :with-registers-p t)
("foo" "," NIL "bar" NIL ";" "baz")
* (split "(,)|(;)" "foo,bar;baz" :with-registers-p t :omit-unmatched-p t)
("foo" "," "bar" ";" "baz")
* (split ":" "a:b:c:d:e:f:g::")
("a" "b" "c" "d" "e" "f" "g")
* (split ":" "a:b:c:d:e:f:g::" :limit 1)
("a:b:c:d:e:f:g::")
* (split ":" "a:b:c:d:e:f:g::" :limit 2)
("a" "b:c:d:e:f:g::")
* (split ":" "a:b:c:d:e:f:g::" :limit 3)
("a" "b" "c:d:e:f:g::")
* (split ":" "a:b:c:d:e:f:g::" :limit 1000)
("a" "b" "c" "d" "e" "f" "g" "" "")
http://weitz.de/cl-ppcre/#split
一般的なケースでは、(新しい、「モダンで一貫性のある」) cl-str 文字列操作ライブラリがあります。
(str:words "a sentence with spaces") ; cut with spaces, returns words
(str:replace-all "," "sentence") ; to easily replace characters, and not treat them as regexps (cl-ppcr treats them as regexps)
cl-slug 非ASCII文字と句読点を削除する必要があります。
(asciify "Eu André!") ; => "Eu Andre!"
; in AutoLisp usage (splitStr "get off of my cloud" " ") returns (get off of my cloud)
(defun splitStr (src delim / Word letter)
(setq wordlist (list))
(setq cnt 1)
(while (<= cnt (strlen src))
(setq Word "")
(setq letter (substr src cnt 1))
(while (and (/= letter delim) (<= cnt (strlen src)) ) ; endless loop if hits NUL
(setq Word (strcat Word letter))
(setq cnt (+ cnt 1))
(setq letter (substr src cnt 1))
) ; while
(setq cnt (+ cnt 1))
(setq wordlist (append wordlist (list Word)))
)
(princ wordlist)
(princ)
) ;defun
(defun splitStr (src pat /)
(setq wordlist (list))
(setq len (strlen pat))
(setq cnt 0)
(setq letter cnt)
(while (setq cnt (vl-string-search pat src letter))
(setq Word (substr src (1+ letter) (- cnt letter)))
(setq letter (+ cnt len))
(setq wordlist (append wordlist (list Word)))
)
(setq wordlist (append wordlist (list (substr src (1+ letter)))))
)