【问题标题】:regexp for elispelisp 的正则表达式
【发布时间】:2011-09-14 12:05:48
【问题描述】:

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

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

#000000 - #ffffff

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

...尾随和前导0 被认为是不相关的。我怎么写这个?我的问题够清楚吗?

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

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

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

【问题讨论】:

  • 只是为了澄清,根据您的第一个问题,正则表达式不用于生成组合,而是用于搜索文本中的文本模式。

标签: regex emacs


【解决方案1】:

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

下一次运行M-x keep-lines。它会要求您输入正则表达式,然后删除任何不匹配的行。使用正则表达式^[a-f]\{,6\}$,它会过滤掉任何不能成为颜色一部分的东西。

具体来说,^ 使正则表达式从行首开始,[a-f] 匹配af(包括)之间的任何一个字符,{,6} 让它匹配前一项的 0 和 6 个实例(在这种情况下,字符类 [a-f] 和最后的 $ 告诉它下一项必须是行尾。

【讨论】:

  • 不错的答案,确实。我走了艰难的路线:)
【解决方案2】:

这将返回缓冲区中所有#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))

我实际上不确定这是否是您所要求的。 “字典”是什么意思?

【讨论】:

    【解决方案3】:

    一个可以返回包含您在其中指定的所有元素的哈希表的表单可能是这样的:

    (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)))
    

    我不太明白你的第二个问题。单词也会使用十六进制空间吗?然后你会只考虑由数字组成的单词,还是也会包括单词中的字母?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多