регулярное выражение для elisp - PullRequest
1 голос
/ 14 сентября 2011

В Emacs я хотел бы написать некоторое регулярное выражение, которое выполняет следующее:

Во-первых, вернуть список всех словарных слов, которые могут быть сформированы в «шестнадцатеричном пространстве». Под этим я подразумеваю:

#000000 - #ffffff

поэтому #00baba будет словом (которое можно посмотреть в словаре)
так будет #baba00
и #abba00
и #0faded

... где конечные и ведущие 0 считаются неактуальными. Как бы я написал это? Достаточно ли ясен мой вопрос?

Во-вторых, я хотел бы создать список слов, которые можно составить, используя цифры в качестве букв:

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

... и так далее. Как бы я написал это?

Ответы [ 3 ]

5 голосов
/ 14 сентября 2011

Сначала загрузите ваш словарь.Я предполагаю, что вы используете /var/share/dict/words, который почти всегда устанавливается по умолчанию, когда вы работаете в Linux.В нем по одному слову в строке, что очень удобно для такого рода вещей.

Следующий запуск M-x keep-lines.Он попросит у вас регулярное выражение, а затем удалит любую строку, которая ему не соответствует.Используйте регулярное выражение ^[a-f]\{,6\}$, и оно отфильтрует все, что не может быть частью цвета.

В частности, ^ заставляет регулярное выражение начинаться в начале строки, совпадение [a-f]любой символ, который находится между a и f (включительно), {,6} позволяет ему соответствовать от 0 до 6 экземпляров предыдущего элемента (в этом случае класс символов [a-f] и, наконец, $ сообщаетэто то, что следующей вещью должен быть конец строки.

0 голосов
/ 14 сентября 2011

Форма, которая вернет вам хеш-таблицу со всеми элементами, указанными в ней, может быть такой:

(let ((hash-table (make-hash-table :test 'equal)))
  (dotimes (i (exp 256 3))
    (puthash (concat "#" (format "%06x" i)) t hash-table))
  hash-table)

Я не уверен, как Emacs будет управлять таким размером элементов (16 миллионов). Поскольку вы не хотите 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)))

Я не совсем понимаю ваш второй вопрос. Слова будут также использовать шестнадцатеричное пространство? Тогда вы бы рассмотрели только слова, образованные цифрами, или включили бы буквы в слове?

0 голосов
/ 14 сентября 2011

Это вернет список всех экземпляров #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))

Я на самом деле не уверен, что это то, что вы просили. Что вы подразумеваете под "словарь"?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...