2

Is there a native Emacs Lisp function that behaves like strpos() in PHP? It should return the position of first occurrence of the given string in current buffer. Function search-forward is nice, but it modifies the character position.

4

2 回答 2

5

PHP中对应的函数strpos,用于在另一个字符串中搜索一个字符串,search来自cl包:

(require 'cl)
(search needle haystack :start2 offset)

如果要在缓冲区内搜索字符串,请使用search-forward. 由于这会更改当前缓冲区和该缓冲区内的点,因此您需要将函数包装在save-excursion; 这是一个常见的 Emacs Lisp 习惯用法。您还应该将函数包装在 中save-match-data,以免干扰对调用您的代码的任何内容的搜索。

(save-match-data
  (save-excursion
    (set-buffer haystack)
    (goto-char (or offset (point-min)))
    (let ((pos (search-forward needle nil t)))
      ...)))
于 2010-10-09T19:27:38.767 回答
3

你可以做:

;; does not modify match-data
(string-match-p (regexp-quote "string") (buffer-string))

或者

;; does modify match-data
(string-match (regexp-quote "string") (buffer-string))

但是这些调用会复制字符串,这是不切实际的。更好的解决方案是使用这个:

(defun my-strpos (string)
  "mimic strpos"
  (save-excursion
    (save-match-data
      (goto-char (point-min))               ; or not
      (when (search-forward string nil t)
        (match-beginning 0)))))

这也取决于你找到职位后想要做什么。匹配数据的文档可能很有用。如果要使用match-data后缀,请删除对'save-match-data.

于 2010-10-09T17:02:39.913 回答