检查字符串是否只是字母(没有符号和数字)lisp

时间:2012-05-06 08:28:40

标签: string lisp

我需要检查一个单词是否只是带字母 示例“hfjel”返回true “df(f0”返回错误

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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"; }

以上几乎可以公平对待这类人物。