From Newsgroup: comp.lang.lisp
Erik Haugan wrote:
* Daniel Pittman <dan...@rimspace.net>
What is the best, easiest, fastest, etc, way to split a string into substrings based on a character position.
(defun string-split (string &optional (delimiter #\Space))
(with-input-from-string (*standard-input* string)
(let ((*standard-output* (make-string-output-stream)))
(loop for char = (read-char nil nil nil)
if (or (null char)
(char= char delimiter))
collect (get-output-stream-string *standard-output*)
else
do (write-char char)
while char))))
Gauche Scheme
;; Preserves empty strings.
(define (split-on-char text :optional (delimiter #\space))
(let ((result '()) (tmp '()))
(string-for-each
(lambda (c)
(if (char=? c delimiter)
(begin
(push! result tmp)
(set! tmp '()))
(push! tmp c)))
text)
(when (or (pair? result) (pair? tmp)) (push! result tmp))
(reverse
(map
(lambda(xs) (list->string (reverse xs)))
result))))
(split-on-char "foo;bar" #\;)
===>
("foo" "bar")
(split-on-char ";foo;;bar;" #\;)
===>
("" "foo" "" "bar" "")
--- Synchronet 3.21a-Linux NewsLink 1.2