elispでの検索とその後の処理

org2blogでのorg-roamのノードの投稿 を実装した際に得た知見を書き出す。

検索

正規表現での検索は re-search-forward で行なう。この関数を実行するとカーソルが移動するため、 必要に応じて save-excursion などで元のカーソル位置などを保存する。

下記をテスト用の文字列とする。(■はカーソル位置)

■abc-123-ABC

カーソル位置で下記のLispを実行する。

(defun test-search ()
  (re-search-forward "\\(abc\\)-\\(123\\)-\\(ABC\\)"))

カーソルはマッチした正規表現の後部に移動する。

abc-123-ABC■

置換

テスト用の文字列の 123456 に変換してみる。

(defun test-replace ()
  (re-search-forward "\\(abc\\)-\\(123\\)-\\(ABC\\)")
  (replace-match "\\1-456-\\3")) 

abc-456-ABC■

削除

削除はマッチした文字列を空文字に置換することで実現できる。

(defun test-delete-1 ()
  (re-search-forward "\\(abc\\)-\\(123\\)-\\(ABC\\)")
  (replace-match "")) 

また、マッチ部分の位置情報を利用しても可能である。

(defun test-delete-2 ()
  (re-search-forward "\\(abc\\)-\\(123\\)-\\(ABC\\)")
  (delete-region (match-beginning 0) (match-end 0))) 

match-beginningmatch-end の引数は正規表現のグループ番号なので、それを指定することでグループ単位での位置情報も利用できる。 abc-123-ABC123 を削除するには下記のように指定する。

(defun test-delete-3 ()
  (re-search-forward "\\(abc\\)-\\(123\\)-\\(ABC\\)")
  (delete-region (match-beginning 2) (match-end 2))) 

abc--ABC■