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.
问问题
1261 次
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 回答