проблема с использованием replace-regexp в lisp - PullRequest
3 голосов
/ 27 мая 2011
В моем файле

у меня много экземпляров ID = "XXX", и я хочу заменить первый с ID = "0", второй с ID = "1" и т. Д.

Когда я использую regexp-replace в интерактивном режиме, я использую ID="[^"]*" в качестве строки поиска и ID="\#" в качестве строки замены, и все хорошо.

Теперь я хочу связать это с ключомпоэтому я попытался сделать это в lisp, вот так:

(replace-regexp "ID=\"[^\"]*\"" "ID=\"\\#\"")

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

1 Ответ

9 голосов
/ 27 мая 2011

К сожалению, конструкция \# доступна только при интерактивном вызове replace-regexp.Из документации :

In interactive calls, the replacement text may contain `\,'
followed by a Lisp expression used as part of the replacement
text.  Inside of that expression, `\&' is a string denoting the
whole match, `\N' a partial match, `\#&' and `\#N' the respective
numeric values from `string-to-number', and `\#' itself for
`replace-count', the number of replacements occurred so far.

И в конце документации вы увидите эту подсказку:

This function is usually the wrong thing to use in a Lisp program.
What you probably want is a loop like this:
  (while (re-search-forward REGEXP nil t)
    (replace-match TO-STRING nil nil))
which will run faster and will not set the mark or print anything.

Что затем приводит нас к этому фрагментуelisp:

(save-excursion
  (goto-char (point-min))
  (let ((count 0))
    (while (re-search-forward "ID=\"[^\"]*\"" nil t)
      (replace-match (format "ID=\"%s\"" (setq count (1+ count)))))))

Вы также можете использовать клавиатуру macro , но я предпочитаю решение для lisp.

...