在Emacs中,我想写一些regexp,做以下事情:
首先,返回可以在"十六进制空间"内形成的所有字典单词的列表。我的意思是:
#000000 - #ffffff
所以#00baba
是一个单词(可以在字典中查找)#baba00
也一样和#abba00
和#0faded
…后面和前面的0
被认为是不相关的。我该怎么写呢?我的问题够清楚吗?
第二,我想生成一个可以用数字作为字母组成的单词列表:
-
0 = o
-
1 = i
-
3 = e
-
4 = a
…等等......我该怎么写呢?
首先,加载您的字典。我假设您使用的是/var/share/dict/words
,当您运行Linux时,它几乎总是默认安装的。它每行列出一个单词,这是一种非常方便的格式。
下一步运行M-x keep-lines
。它会要求你输入一个正则表达式,然后删除任何与它不匹配的行。使用正则表达式^[a-f]{,6}$
,它将过滤掉任何不能成为颜色一部分的内容。
具体来说,^
使regex从行开头开始,[a-f]
匹配a
和f
(包括)之间的任何一个字符,{,6}
让它匹配前一项的0到6个实例(在本例中是字符类[a-f]
,最后$
告诉它下一项必须是行结束。
这将返回缓冲区中#000000
- #ffffff
的所有实例的列表,尽管这种模式可能对您的目的没有足够的限制。
(let ((my-colour-list nil))
(save-excursion
(goto-char (point-min))
(while (re-search-forward "#[0-9a-fA-F]\{6\}" nil t)
(add-to-list 'my-colour-list (match-string-no-properties 0)))
my-colour-list))
我不确定这是不是你想要的。你说的"字典"是什么意思?
返回一个包含所有指定元素的哈希表的表单可以是这样的:
(let ((hash-table (make-hash-table :test 'equal)))
(dotimes (i (exp 256 3))
(puthash (concat "#" (format "%06x" i)) t hash-table))
hash-table)
我不确定Emacs将如何管理元素的大小(1600万)。由于您不想要0
,您可以生成没有该格式的空格,并删除末尾的0。我不知道你想怎么处理剩下的数字。你可以像这样一步一步地编写这个函数:
(defun find-hex-space ()
(let (return-list)
(dotimes (i (exp 256 3))
(let* ((hex-number (strip-zeros (format "%x" i)))
(found-word (gethash hex-number *dictionary*)))
(if found-word (push found-word return-list))))
return-list))
函数strip-zeros
很容易写,这里我假设你的单词在一个名为*dictionary*
的哈希中。strip-zeros
可以是这样的:
(defun strip-zeros (string)
(let ((sm (string-match "^0*\(.*?\)0*$" string)))
(if sm (match-string 1 string) string)))
我不太明白你的第二个问题。这些单词也会使用十六进制空格吗?那么你会只考虑由数字组成的单词,还是也包括单词中的字母?