elisp regexp поиск в строках, а не в буферах - PullRequest
41 голосов
/ 19 июля 2010

Я искал всюду в документации по emacs lisp, как искать регулярные выражения в строке.Все, что я нахожу, это как сделать это в буферах.

Что-то мне не хватает?Должен ли я просто плюнуть строку во временный буфер и найти ее там?Это просто стиль кодирования elisp, к которому я привыкну?Есть ли стандартное решение этой проблемы.Манипуляции с буферами кажутся нелепыми, когда я просто должен иметь возможность искать прямо в уже существующей переменной.

Ответы [ 4 ]

28 голосов
/ 19 июля 2010

Вот обсуждение содержимого строки против содержимого буфера в вики Emacs. Просто сохраните вашу строку как переменную.

Хитрая вещь о строках что вы обычно не изменяете саму строку (кроме случаев, когда вы выполняете функции массива над строкой, поскольку строка является массивом, но этого, как правило, следует избегать), но вы возвращаете измененную строку.Вот пример использования строки в elisp.

Это урезает пробел с конца строки:

(setq test-str "abcdefg  ")
(when (string-match "[ \t]*$" test-str)
    (message (concat "[" (replace-match "" nil nil test-str) "]")))
12 голосов
/ 19 июля 2010

Функция, которую вы ищете: string-match. Если вам необходимо выполнить сопоставление повторно, используйте индекс, который он возвращает, в качестве необязательного параметра «start» для следующего вызова. Документация содержится в руководстве по ELisp, глава «Поиск по регулярному выражению».

3 голосов
/ 12 мая 2014

Чтобы заменить каждое совпадение регулярного выражения в строке, взгляните на replace-regexp-in-string.

1 голос
/ 23 августа 2014

Для поиска начала строки

(defun string-starts-with-p (string prefix)
    "Return t if STRING starts with PREFIX."
    (and
     (string-match (rx-to-string `(: bos ,prefix) t)
                   string)
     t))

Для поиска конца строки

(defun string-ends-with-p (string suffix)
  "Return t if STRING ends with SUFFIX."
  (and (string-match (rx-to-string `(: ,suffix eos) t)
                     string)
       t))
...