2013-03-13 14 views
13

私はユーザー入力を受け取り、リストに格納しようとしていますが、単一の文字列からなるリストの代わりに、スキャンした各単語を独自の文字列にします。 例:Lisp - 別々の文字列に入力を分割する

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

は返します:

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

を、私は私の最終的なリストには、スペースまたは句読点を望んでいないノートを取ります。

すべての入力をいただければ幸いです。

+0

チェックアウトhttp://cl-cookbook.sourceforge.net/strings.html:非ASCII文字をVEのも句読点分割して句読点などを削除することができます。 –

答えて

17

split-sequenceは、既製のソリューションです。

また、あなた自身をロールバックすることができます:

あなたはこの文字で分割するかどうかをチェックし delimiterp
(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)) 

、例えば

(defun delimiterp (c) (or (char= C#\Space) (char= C#\,))) 

または

(defun delimiterp (c) (position c " ,.;/")) 

PS。あなたの予想される戻り値を見て、my-splitの前にstring-downcaseに電話したいと思うようです。

PPS。 my-splitを簡単に変更して、:start:end:delimiterp &cを受け入れることができます。

PPPS。 my-splitの最初の2つのバージョンのバグについては残念です。 ではなく、は、この機能を独自のバージョンにロールアップすることを前提としていますが、既製のソリューションを使用してください。

+0

スプリットシーケンスでたくさんの素材を見つけましたが、明らかにcl-utilitiesパッケージをインポートする必要があります。ちょうどその方法を理解できません=/ #imanewb –

+2

@SeanEvans:注意! 'import'はあなたがやっているCL関数です*ここでは必要ありません!あなたが必要とするのは* quicklisp *: '(ql:quickload" split-sequence ")' – sds

+0

などを使ってパッケージをインストールすることです。本当にありがとう。 –

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 
1

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) 

あなたはremoにcl-slugがある彼らは一般的な使用例の束が、単純なスペースとなっているものを持っている機能

(asciify "Eu André!") ; => "Eu Andre!" 
0
(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))))) 
) 
+0

これは疑問に答えるかもしれませんが、あなたのコードと参考になる可能性のある参考文献の説明を提供することは常に良いことです。回答の詳細については、[回答]を参照してください。 –

関連する問題