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")