2013-03-13 8 views
13

Próbuję pobrać dane użytkownika i zapisać je na liście, ale zamiast listy składającej się z pojedynczego ciągu chcę, aby każde słowo zostało zeskanowane jako własny ciąg. Przykład:Lisp - Dzielenie danych wejściowych na oddzielne ciągi znaków

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

wróci:

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

Biorąc pod uwagę, że nie ma żadnych spacji ani znaków interpunkcyjnych w moim ostatnim liście.

Wszelkie dane wejściowe będą bardzo mile widziane.

+0

Zamówienie http://cl-cookbook.sourceforge.net/strings.html mają grono wspólnym przypadku korzystania z funkcji, z których jedna jest prosty przestrzeń podzielić, które można zmodyfikować, aby usunąć interpunkcję i tym podobne. –

Odpowiedz

17

split-sequence to gotowe rozwiązanie.

można również toczyć własne:

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

gdzie delimiterp sprawdza, czy chcesz podzielić się na tej postaci, na przykład

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

lub

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

PS. patrząc na oczekiwaną wartość zwrotu, wydaje się, że chcesz zadzwonić pod numer string-downcase przed my-split.

PPS. można łatwo zmodyfikować my-split, aby zaakceptować :start,, aby uzyskać więcej informacji.

PPPS. Przepraszamy za błędy w dwóch pierwszych wersjach my-split. Proszę wziąć pod uwagę wskaźnik, że należy wykonać własną wersję tej funkcji, ale należy skorzystać z gotowego rozwiązania.

+0

Znajduję mnóstwo materiału na podzielonej sekwencji, ale najwyraźniej muszę zaimportować pakiet cl-utilities, którego po prostu nie mogę wymyślić, jak to zrobić =/ #imanewb –

+2

@SeanEvans: ostrożnie! 'import' jest funkcją CL, którą robisz * nie * chcesz tutaj! potrzebne jest * zainstalowanie * pakietu za pomocą np. * quicklisp *: '(ql: quickload" split-sequence ")' – sds

+0

To bardzo pomogło. Dzięki wielkie. –

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

Jest 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

Dla typowych przypadkach nie jest (nowy, "nowoczesne i spójne") cl-str ciąg biblioteka manipulacji:

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

You mieć cl-slug do usunięcia ve znaków spoza ASCII, a także znaki przestankowe:

(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

Chociaż może to odpowiedzieć na pytanie, zawsze dobrze jest podać wyjaśnienie kodu i wszelkie odniesienia, które mogą być pomocne. Sprawdź [odpowiedź], aby uzyskać szczegółowe informacje na temat odpowiadania na pytania. –

Powiązane problemy