Emacs Lispの質問です。

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

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

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/03/26 18:11:00
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:rubikitch No.2

回答回数120ベストアンサー獲得回数22

ポイント40pt

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

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

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

id:room661

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

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

これで満足です。

2009/03/26 18:09:41

その他の回答2件)

id:skoji-jp No.1

回答回数7ベストアンサー獲得回数0

ポイント40pt

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

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:room661

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

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

2009/03/26 18:09:57
id:rubikitch No.2

回答回数120ベストアンサー獲得回数22ここでベストアンサー

ポイント40pt

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

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

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

id:room661

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

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

これで満足です。

2009/03/26 18:09:41
id:chakoku No.3

回答回数15ベストアンサー獲得回数2

ポイント10pt

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

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

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

以下はどうでしょうか

(setq str "h_o_g_e")

(while (string-match "_" str)

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


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

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

別解として。。

  • id:chakoku
    専用関数がありましたか。。勉強不足で申し訳有りません。 m(_ _)m
  • id:room661
    id:chakoku さん
    ご回答ありがとうございました!
  • id:chakoku
    rubikitch さんが紹介されたreplace-regexp-in-string は 
    Emacs-21.1 で新設された関数のようですね(他人のブログより)。
    ちゃんと情報を追いかけないといけませんね。。反省

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません