Emacs Lispで Perlでの s/regexp/replaced/e を実現する
Perlでいうところの s/regexp/replaced/e を知りたかったので
調べてみました.
実現方法
search-forward(re-search-forwardと同じ)と replace-matchを組み合わせる
ことで実現できます. query-replace-regexp-evalといういかにもな名前の
関数があったのですが, obsoleteなので使わない方が良いでしょう.
例
(defun test (str) (with-temp-buffer (insert str) (goto-char (point-min)) (while (re-search-forward "[1-9][0-9]*" nil t) (let ((matched-num (string-to-number (match-string 0)))) (replace-match (number-to-string (* 2 matched-num)) t))) (buffer-string))) (test "111-222-333") ;; => "222-444-666" (test "555-666-777") ;; => "1110-1332-1554"
バッファに展開しなくてもできるかもしれないですが, bufferに展開して
から処理していって, 最後にそのバッファの文字列を返すようにすると
良いと思います.