elisp的正则表达式

时间:2011-09-13 21:43:26

标签: regex emacs

在Emacs中,我想编写一些执行以下操作的正则表达式:

首先,返回可在“十六进制空间”中形成的所有字典单词的列表。我的意思是:

#000000 - #ffffff

所以#00baba会是一个单词(可以在字典中查找)
#baba00#abba00
#0faded

...尾随和领先0被认为是无关紧要的。我怎么写这个?我的问题是否足够明确?

其次,我想生成一个可以使用数字作为字母的单词列表:

  • 0 = o
  • 1 = i
  • 3 = e
  • 4 = a

......等等。我怎么写这个?

3 个答案:

答案 0 :(得分:5)

首先,加载你的字典。我假设你正在使用/var/share/dict/words,当你运行Linux时,它几乎总是默认安装。它每行列出一个单词,这是一种非常方便的格式。

接下来运行M-x keep-lines。它会要求您提供正则表达式,然后删除任何与之不匹配的行。使用正则表达式^[a-f]\{,6\}$,它将过滤掉任何不属于某种颜色的内容。

具体来说,^使得正则表达式从行的开头开始,[a-f]匹配af(包括)之间的任何一个字符, {,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)))

我不太明白你的第二个问题。单词也会使用十六进制空格?您是否会仅考虑由数字组成的单词,或者还包括单词中的字母?