読者です 読者をやめる 読者になる 読者になる

Emacs Lispで Perlでの s/regexp/replaced/e を実現する

emacs

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に展開して
から処理していって, 最後にそのバッファの文字列を返すようにすると
良いと思います.