人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Emacs Lispの質問です。
文字列が格納されたシンボルに対しての置換は、どう書くのでしょうか。

具体的に説明しますと、
(setq foo "h_o_g_e")
で定義されるシンボル foo に、JavaScriptでいうところの
foo.replace(/_/g, '.');
を適用させたいんですが、elispではこれをどう書けばいいのでしょうか、という質問です。
よろしくお願いします。

●質問者: room661
●カテゴリ:コンピュータ
✍キーワード:elisp Emacs Lisp JavaScript シンボル 定義
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● こじま
●40ポイント

バッファに対しての正規表現置換は簡単ですが、文字列に対して置換する関数は通常含まれていないように思います。

string-matchを使って書くなら、こんな感じでしょうか。

(defun string-replace-regexp (regexp to-string original-string)
 (if (string-match regexp original-string)
 (concat
 (substring original-string 0 (match-beginning 0))
 to-string
 (do-replace regexp to-string (substring original-string (match-end 0))))
 original-string))

このように使います。

(setq foo "h_o_g_e")
(string-replace-regexp "_" "." foo) ; -> "h.o.g.e"
◎質問者からの返答

id:skoji-jp さん、ありがとうございます。

希望通りの処理ができました。


2 ● るびきち
●40ポイント ベストアンサー

replace-regexp-in-stringがそのまま使えます。

もっとも、複雑な置換処理をするならばバッファに入れて処理するほうがよいでしょう。

(replace-regexp-in-string "_" "." "h_o_g_e") ; => "h.o.g.e"

◎質問者からの返答

rubikitch さん、ありがとうございます。

やはり関数がありましたか。

これで満足です。


3 ● chakoku
●10ポイント

バッファを使わずにやるなら、やはり

関数をこねくりまわすしかないと思います。

関数を定義せずにもう少し短く書くなら、、

以下はどうでしょうか

(setq str "h_o_g_e")

(while (string-match "_" str)

(setq str (replace-match "." nil nil str)))


strに "h.o.g.e"が入る

setqばかりで、lisp的な美しさからは程遠いですが。。

別解として。。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ