2

语境

我想生成可以通过以下方式生成的所有字符:

  • 打开记事本
  • 按键盘上的一个键
  • 按住 shift + 按键盘上的单个键

我目前拥有的:

(concat (range (int \a) (int \z))
  (range (int \A) (int \Z))
  (range (int \0) (int \9)))

然后手动添加更多字符,例如 ~!@#$%^&*()_+{}|:"<>?,./;'[]\

问题

有没有更优雅的方式来做到这一点?

编辑

是的,我指的是美国 Qwerty 键盘。

4

2 回答 2

3

如果您查看美国 ASCII 图表,您想要的所有字符似乎都在其中(range 33 127)。因此,获取所有这些字符的序列的最简单方法是将该范围转换为字符。

(map char (range 33 127))

但是,如果您尝试验证字符串是否仅包含这些字符,请使用如下函数:

(defn valid-char? [c]
  (let [i (int c)] 
    (and (> i 32) (< i 127))))

然后你可以用它every?来验证一个字符串:

user=> (every? valid-char? "hello world")
true
user=> (every? valid-char? "héllo world")
false
于 2012-05-23T03:04:20.410 回答
1

使用以下地图形式将生成您想要的字符。

(map #(str (char %)) (range 32 127))
于 2012-05-23T03:01:48.540 回答