19

ユーザー入力を取得してリストに保存しようとしています。単一の文字列で構成されるリストではなく、スキャンされた各単語を独自の文字列にします。例:

> (input)
This is my input. Hopefully this works

戻ります:

("this" "is" "my" "input" "hopefully" "this" "works")

最終的なリストにスペースや句読点を入れたくないことに注意してください。

任意の入力をいただければ幸いです。

4

5 に答える 5

21

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。, , &cmy-splitを受け入れるように簡単に変更できます。:start:end:delimiterp

PPPS。の最初の 2 つのバージョンのバグについて申し訳ありませんmy-splitこれは、この関数の独自のバージョンを作成するのではなく、既製のソリューションを使用するべきであるという指標と考えてください。

于 2013-03-13T18:58:05.837 に答える
1
; 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
于 2014-07-25T19:51:03.693 に答える