我需要检查一个单词是否只有字母示例“hfjel”返回真“df(f0”返回假
任何人都可以向我解释函数符号名称谢谢你的帮助
有一个方便的标准函数可以满足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
您可以结合使用它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
好的,我在上面评论了变音符号,因为这种特殊情况经常被忽视,下面是一个例子:
* (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"; }
以上几乎可以公平对待这种角色。