在Emacs中,我想编写一些执行以下操作的正则表达式:
首先,返回可在“十六进制空间”中形成的所有字典单词的列表。我的意思是:
#000000 - #ffffff
所以#00baba
会是一个单词(可以在字典中查找)
#baba00
和#abba00
和#0faded
...尾随和领先0
被认为是无关紧要的。我怎么写这个?我的问题是否足够明确?
其次,我想生成一个可以使用数字作为字母的单词列表:
0 = o
1 = i
3 = e
4 = a
......等等。我怎么写这个?
答案 0 :(得分:5)
首先,加载你的字典。我假设你正在使用/var/share/dict/words
,当你运行Linux时,它几乎总是默认安装。它每行列出一个单词,这是一种非常方便的格式。
接下来运行M-x keep-lines
。它会要求您提供正则表达式,然后删除任何与之不匹配的行。使用正则表达式^[a-f]\{,6\}$
,它将过滤掉任何不属于某种颜色的内容。
具体来说,^
使得正则表达式从行的开头开始,[a-f]
匹配a
和f
(包括)之间的任何一个字符, {,6}
允许它匹配前一项的0到6个实例(在本例中为字符类[a-f]
,最后$
告诉它下一个必须是结束线。
答案 1 :(得分:0)
这将返回缓冲区中#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))
我实际上并不确定这是你要求的。你是什么意思“词典”?
答案 2 :(得分:0)
一个表单将返回一个哈希表,其中包含您在其中指定的所有元素:
(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)))
我不太明白你的第二个问题。单词也会使用十六进制空格?您是否会仅考虑由数字组成的单词,或者还包括单词中的字母?