语境
我想生成可以通过以下方式生成的所有字符:
- 打开记事本
- 按键盘上的一个键
- 按住 shift + 按键盘上的单个键
我目前拥有的:
(concat (range (int \a) (int \z))
(range (int \A) (int \Z))
(range (int \0) (int \9)))
然后手动添加更多字符,例如 ~!@#$%^&*()_+{}|:"<>?,./;'[]\
问题
有没有更优雅的方式来做到这一点?
编辑
是的,我指的是美国 Qwerty 键盘。
我想生成可以通过以下方式生成的所有字符:
(concat (range (int \a) (int \z))
(range (int \A) (int \Z))
(range (int \0) (int \9)))
然后手动添加更多字符,例如 ~!@#$%^&*()_+{}|:"<>?,./;'[]\
有没有更优雅的方式来做到这一点?
是的,我指的是美国 Qwerty 键盘。
如果您查看美国 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
使用以下地图形式将生成您想要的字符。
(map #(str (char %)) (range 32 127))