2012-05-06 87 views

回答

5

有一個叫alpha-char-p一個方便的標準功能,做你問什麼。

CL-USER(1): (alpha-char-p #\a) 
T 
CL-USER(2): (alpha-char-p #\Γ) 
T 
CL-USER(3): (alpha-char-p #\α) 
T 
CL-USER(4): (alpha-char-p #\0) 
NIL 
CL-USER(5): (alpha-char-p #\.) 
NIL 

可以在conju使用nction與every

CL-USER(7): (every #'alpha-char-p "word") 
T 
CL-USER(8): (every #'alpha-char-p "nonword7") 
NIL 
CL-USER(9): (every #'alpha-char-p "non-alpha-word") 
NIL 
CL-USER(10): (every #'alpha-char-p "今日は") 
T 
+0

是的,每個和一個合適的測試功能(比如說,ALPHA-CHAR-P)是我的直接想法。 – Vatine

+0

感謝您的迴應! – Benius

2

OK,我上面談到變音符號,因爲這種特殊情況下往往被忽視,下面是一個例子:

* (defparameter *weird-letter* 
     (coerce (list (code-char #x0438) 
        (code-char #x0306)) 'string)) 
*WEIRD-LETTER* 

* *weird-letter* 
"и" 

* (length *weird-letter*) 
2 

* (every #'alpha-char-p *weird-letter*) 
NIL 

實際上,我不知道什麼不同的Lisp實現將盡這裏是因爲Unicode支持在其中一些中是不同的(到目前爲止我可以說)。

對於上面的代碼,預期的結果一定是T,因爲實際上,兩個代碼點U + 0438-U + 0306構成一個帶有變音符號的單個字母。 Unicode有兩種拼寫方式,一種是單個字符,另一種是不帶變音符號和變音符號的相同字母的組合。所以,如果你想要超級正確,那麼你將不得不檢查這封信是否後面跟着變音符號,但是(注意!)只有其中一些實際上是有效的字母! Unicode是嚴重的企業...

編輯:

爲了更好地說明我的情況:

#!/opt/ActivePerl-5.14/bin/perl 

binmode STDOUT, ":utf8"; 

my $weird_letter = "\x{0438}\x{0306}"; 
print "$weird_letter\n"; 

if ($weird_letter =~ m/^(\pL|(\pL\pM))+$/) 
    { print "it is a letter!\n"; } 
else { print "it is not a letter!\n"; } 

上面幾乎可以公平地對待這種字符。

相關問題