kobapan@wiLiki
Login
Emacs

Emacs:文字列から文字列を検索する

Emacs Lisp での文字列からの検索系関数をよく忘れるのでメモしておく

使用例

(let ((s "123 I love emacs."))
  (string-match "^\\([0-9]+\\) I love \\(.+\\)$" s)
  (match-string 0 s)                    ; => "123 I love emacs."
  (match-string 1 s)                    ; => "123"
  (match-string 2 s)                    ; => "emacs."
)
(setq string "aaabbb")

; 正規表現で検索
(string-match "a+" string)
0 ← 検索に成功した場合は開始位置が返る

; 一致した部分を取得
(match-string 0 string) 
もしくは
(substring string (match-beginning 0) (match-end 0))
"aaa" ← 指定した部分の文字列

; 一致した部分を置換
(replace-match "bbb" nil nil string)
"bbbbbb" ← 一致した部分を置換して新たに出来た文字列
; 数字列からカンマを抜きたい
(let ((s "3,7,22"))
  (replace-regexp-in-string "," "" s))
"3722"

説明

string-match 正規表現で検索

 string-match REGEXP STRING &optional START

文字列STRINGにおいて正規表現REGEXPに一致した最初の箇所の添字を返す。

一致がなければ`nilを返す。

STARTが`nil以外であると、STRINGの指定した添字から探索を始める。

match-string 一致した部分を取得

 match-string [0 1 ... N] STRING

replace-match 一致した部分を置換

さらに一致した部分を置換するには、replace-matchを使う

 replace-match REPLACEMENT &optional FIXEDCASE LITERAL STRING SUBEXP

この関数は、最後の探索で一致したバッファ内(あるいは文字列STRING)のテキストを置換する。当該テキストをREPLACEMENTで置き換える。

バッファで最後に探索を行った場合には、STRINGに`nilを指定すること。そうすると、`replace-matchはバッファを編集することで置換を行い、置換したテキストの末尾にポイントを置き`tを返す。

文字列で探索した場合には、STRINGに同じ文字列を渡すこと。そうすると、replace-matchは新たな文字列を構築することで置換を行い、新たな文字列を返す。

replace-regexp-in-string すべてのマッチを見つけてそれらを置換する

 replace-regexp-in-string regexp rep string &optional fixedcase literal subexp start

stringをコピーして正規表現regexpにたいするマッチを検索、それらをrepに置き換える。これは変更されたコピーをリターンする。startが非nilならマッチにたいする検索はstring内のそのインデックスから開始されて、そのインデックスより前で始まるマッチは変更されない。

この関数は置換を行うためにオプション引数fixedcase、literal、subexpを渡してreplace-matchを使用する。

バッファ内での検索の場合

(re-search-forward "aaa")
(buffer-substring (match-beginning 0) (match-end 0))
(replace-match "bbb")

Debian
Emacs
Firefox
Gauche
JavaScript
Linux
Scheme
org-mode/latex

More ...