2

strpos()PHPのように動作するネイティブのEmacsLisp関数はありますか?現在のバッファで指定された文字列が最初に出現する位置を返す必要があります。機能search-forwardは素晴らしいですが、それはキャラクターの位置を変更します。

4

2 に答える 2

5

PHPで対応するstrpos、別の文字列内の文字列を検索する関数は、パッケージsearchからのものです。cl

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

バッファ内の文字列を検索する場合は、を使用しますsearch-forward。これにより、現在のバッファーとそのバッファー内のポイントが変更されるため、関数をsave-excursion;内にラップする必要があります。これは一般的なEmacsLispイディオムです。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 に答える