2013-03-13 9 views
13

Ich versuche Benutzereingaben zu machen und sie in einer Liste zu speichern. Nur anstelle einer Liste, die aus einer einzigen Zeichenfolge besteht, möchte ich jedes eingelesene Wort als eigene Zeichenfolge verwenden. Beispiel:Lisp - Eingabe in separate Strings teilen

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

zurückkehren würde:

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

Notiz nehmen, dass ich will keine Leerzeichen oder Satzzeichen in meiner endgültigen Liste.

Jede Eingabe würde sehr geschätzt werden.

+0

Kasse http://cl-cookbook.sourceforge.net/strings.html sie haben eine Reihe von gemeinsamen Anwendungsfall funktioniert eine davon ist ein einfacher Raum Split, die Sie ändern könnten, um Interpunktion und ähnliches zu entfernen. –

Antwort

17

split-sequence ist die Lösung von der Stange.

können Sie auch Ihre eigene Rolle:

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

wo delimiterp prüft, ob Sie auf dieses Zeichen geteilt werden soll, z.B.

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

oder

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

PS. Wenn Sie Ihren erwarteten Rückgabewert betrachten, möchten Sie string-downcase vor my-split anrufen.

PPS. Sie können einfach ändern, um :start, :end, :delimiterp & c anzunehmen. c.

PPPS. Sorry über Bugs in den ersten beiden Versionen von my-split. Bitte beachten Sie, dass ein Indikator, dass man nicht eine eigene Version dieser Funktion rollen sollte, aber die Standardlösung verwenden.

+0

Ich finde viel Material auf Split-Sequenz, aber anscheinend muss ich das cl-Dienstprogramme-Paket importieren, das ich einfach nicht herausfinden kann, wie man tut =/ #imanewb –

+2

@SeanEvans: vorsichtig! 'import' ist eine CL-Funktion, die du * hier * nicht willst! was Sie brauchen, ist * installieren * das Paket mit z. B. * quicklisp *: '(ql: quickload" split-sequence ")' – sds

+0

Dies hat sehr geholfen. Vielen Dank. –

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

dort ist 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

Für häufige Fälle gibt es die (neue, "moderne und konsistente") cl-str String-Manipulation Bibliothek:

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

Sie haben cl-slug zu remo ve Nicht-ASCII-Zeichen und auch Zeichensetzung:

(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

Während dies die Frage beantworten kann, ist es immer gut, eine Erklärung Ihres Codes und aller Referenzen, die hilfreich sein können, zu geben. Weitere Informationen zur Beantwortung von Fragen finden Sie unter [Antwort]. –

Verwandte Themen