2016-04-17 11 views
7

Tôi đang tìm cách lặp qua một chuỗi trong LISP để kiểm tra alpha char hoặc dấu cách. Một câu như "Cà phê là bạn" là thứ mà tôi muốn kiểm tra là hợp lệ. Nhưng khi tôi làm (mỗi "alpha-char-p" cà phê là tốt nhất "') nó không thành công trên không gian bởi vì không gian không phải là kỹ thuật alpha-char. Gợi ý?Lặp qua một chuỗi trong lisp cho các ký tự alpha HOẶC không gian

Cảm ơn!

Trả lời

8

Đơn giản chỉ cần kiểm tra alpha-char hoặc không gian:

(every 
    (lambda (c) (or (alpha-char-p c) (char= C#\Space))) 
    "coffee is best") 

every mất như tham số đầu tiên một chức năng mà phải trả lại phi nil trên mọi phần tử của tham số thứ hai dãy.

8

Sử dụng LOOP:

CL-USER > (loop for c across "tea is best" 
       always (or (alpha-char-p c) 
          (char= C#\space))) 
T 
4

Tùy thuộc vào mức độ phức tạp của công việc, bạn cũng có thể sử dụng biểu thức thông thường. Nếu bạn tải CL-PPCRE, bạn có thể viết:

(ppcre:scan "^[ a-zA-Z]*$" "Coffee is Friend") 

Các biểu thức chính quy được chấp nhận bởi thư viện là một chuỗi Perl-tương tự, hoặc một phân tích cây. Ví dụ, gọi (ppcre:parse-string "^[ a-zA-Z]*$") cho:

(:SEQUENCE 
:START-ANCHOR 
(:GREEDY-REPETITION 0 
        NIL 
        (:CHAR-CLASS #\ 
            (:RANGE #\a #\z) 
            (:RANGE #\A #\Z))) 
:END-ANCHOR) 

Các hình thức trên có sử dụng của nó khi bạn phải kết hợp biểu thức thông thường, bởi vì nó là dễ dàng hơn nhiều so với concatenating và thoát chuỗi.

Các vấn đề liên quan