Path: news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: "B. Pym" Newsgroups: comp.lang.lisp Subject: Re: cl-ppcre question Date: Fri, 27 Jun 2025 16:54:38 -0000 (UTC) Organization: A noiseless patient Spider Lines: 60 Message-ID: <103micc$8rr4$1@dont-email.me> References: <103ma3r$6vlm$1@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Injection-Date: Fri, 27 Jun 2025 18:54:38 +0200 (CEST) Injection-Info: dont-email.me; posting-host="74a7a1c2fb42cf4b7c53d28ac874f0b2"; logging-data="290660"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+Z5hdwb8JlPR7HFyBdn/PT" User-Agent: XanaNews/1.18.1.6 Cancel-Lock: sha1:11pQ8v4RAUjgzKEwRrutY3059fs= B. Pym wrote: > B. Pym wrote: > > > Madhu wrote: > > > > > > I would like to parse color names in X11's rgb.txt. They look like this: > > > > > > > > 119 136 153 light slate gray > > > > 119 136 153 LightSlateGray > > > > > > > > When parsing each line, I would like to get the color triplet, and the > > > > name. I tried it like this: > > > > > > > > (let ((color-scanner > > > > (cl-ppcre:create-scanner > > > > "^ +([0-9]{0,2}) +([0-9]{0,2}) +([0-9]{0,2}) +([ a-zA-Z0-9]+)"))) > > > > (cl-ppcre:scan-to-strings color-scanner " 1 2 3 foo bar baz ")) > > > > > > > > This gives #("1" "2" "3" "foo bar baz ") for the substrings. How can > > > > I get rid of the trailing spaces? > > > > > > Use the right tool for the job :) > > > > > > (defun parse-rgb-line (string &key (start 0) end) > > > (multiple-value-bind (r endr) > > > (parse-integer string :start start :end end :junk-allowed t) > > > (multiple-value-bind (g endg) > > > (parse-integer string :start (1+ endr) :end end :junk-allowed t) > > > (multiple-value-bind (b endb) > > > (parse-integer string :start (1+ endg) :end end :junk-allowed t) > > > (let ((name-startpos > > > (position-if-not (lambda (c) (case c ((#\Tab #\Space) t))) > > > string :start (1+ endb)))) > > > (values (format nil "#~2,'0X~2,'0X~2,'0X" r g b) > > > (subseq string name-startpos end))))))) > > Gauche Scheme > > (use srfi-13) ;; string-trim-both > > (define (parse-rgb-line line) > (with-input-from-string line > (lambda() > (append > (list (read) (read) (read)) > (list (string-trim-both (read-line))))))) > > (parse-rgb-line " 255 88 6 yes no ") > ===> > (255 88 6 "yes no") Shorter: (define (parse-rgb-line line) (with-input-from-string line (lambda() (list (read) (read) (read) (string-trim-both (read-line))))))