2013-03-13 5 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 그들은 일반적인 사용 사례의 무리 중 하나 기능 간단한 공간이 구두점을 제거하기 위해 수정할 수있는 split. –

답변

17

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에 전화하고 싶을 것 같습니다.

PPS. my-split을 쉽게 수정하여 :start, :end, :delimiterp &c를 수락 할 수 있습니다.

PPPS. my-split 처음 두 버전의 버그에 대해 사과드립니다. 이 아님을 나타내는 표시기는이이 기능의 자체 버전을 게시하지만 기성품 솔루션을 사용하십시오.

+0

split-sequence에서 많은 자료를 찾았지만 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있다 :

(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) 

당신에게 :

* (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 문자열 조작 라이브러리가 remo에 cl-slug이 있습니다. ASCII 문자가 아닌 문자도 문장을했습니다 :

(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

이 질문에 답할 수 있지만 유용한 코드 및 참조 정보를 제공하는 것이 좋습니다. 답변에 대한 자세한 내용은 [답변]을 확인하십시오. –