regexp for elisp



在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]匹配af(包括)之间的任何一个字符,{,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)))
我不太明白你的第二个问题。这些单词也会使用十六进制空格吗?那么你会只考虑由数字组成的单词,还是也包括单词中的字母?

最新更新