2

我需要检查一个单词是否只有字母示例“hfjel”返回真“df(f0”返回假

任何人都可以向我解释函数符号名称谢谢你的帮助

4

2 回答 2

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

您可以结合使用它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
于 2012-05-06T08:44:12.137 回答
2

好的,我在上面评论了变音符号,因为这种特殊情况经常被忽视,下面是一个例子:

* (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"; }

以上几乎可以公平对待这种角色。

于 2012-05-06T09:18:33.733 回答