Elisp regexp поиск в строках, а не в буферах
Я искал всюду в документации emacs lisp для поиска регулярных выражений в строке. Все, что я нахожу, это сделать это в буферах.
Есть ли что-то, что мне не хватает? Должен ли я просто выплюнуть свою строку во временный буфер и найти его там? Это просто стиль кодирования elisp, к чему я привык? Существует ли стандартное решение этой проблемы. Манипулирование буферами кажется неуклюжим, когда я должен просто искать прямо в уже существующую переменную.
Ответы
Ответ 1
Ниже приведено обсуждение содержимого строки и содержимого буфера в вики Emacs. Просто сохраните свою строку как переменную.
Трудная вещь о строках заключается в том, что вы вообще не изменяете сама строка (кроме случаев, когда вы выполняете функции массива в строке, поскольку строка это массив, но этого обычно следует избегать), но вы возвращаете измененную строку.
Во всяком случае, вот пример использования строки в elisp.
Это приведет к обрезке пробела с конца строки:
(setq test-str "abcdefg ")
(when (string-match "[ \t]*$" test-str)
(message (concat "[" (replace-match "" nil nil test-str) "]")))
Ответ 2
Функция, которую вы ищете, - string-match
. Если вам нужно повторно выполнить сопоставление, используйте индекс, который он возвращает как дополнительный параметр "начать" для следующего вызова. Документация находится в руководстве ELisp, глава "Поиск регулярных выражений".
Ответ 3
Чтобы заменить каждое регулярное выражение в строке, посмотрите replace-regexp-in-string
.
Ответ 4
Чтобы начать поиск строки
(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))