2016-04-17 21 views
7

Sto cercando come eseguire il ciclo di una stringa in LISP per verificare la presenza di caratteri alfabetici o spazi. Una frase come "Il caffè è amico" è qualcosa che voglio verificare come valido. Ma quando lo faccio (ogni # 'alfa-char-p "è il caffè migliore") non riesce negli spazi perché lo spazio non è tecnicamente alfa-char. Suggerimenti?Ciclo attraverso una stringa in lisp per caratteri alfabetici O spazio

Grazie!

risposta

8

Semplicemente testare per l'alfa-char o spazio:

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

every prende come primo parametro una funzione che deve restituire non-nil su ogni elemento della sequenza secondo parametro.

8

Utilizzando LOOP:

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

A seconda della complessità del compito, si potrebbe anche usare le espressioni regolari. Se si carica CL-PPCRE, è possibile scrivere:

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

L'espressione regolare che è accettato dalla libreria è una stringa Perl-like, o un parse-albero. Ad esempio, la chiamata (ppcre:parse-string "^[ a-zA-Z]*$") dà:

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

Il modulo di cui sopra ha la sua utilità quando si deve coniugare espressioni regolari, perché è molto più facile che concatenazione di stringhe e fuggire.

Problemi correlati