32

replace-regexp-in-stringリテラル文字列のみを使用し、正規表現を使用しないものと同等のものを探しています。

(replace-regexp-in-string "." "bar" "foo.buzz") => "barbarbarbarbarbarbarbar"

でも私はしたい

(replace-in-string "." "bar" "foo.buzz") => "foobarbuzz"

いろいろreplace-*機能を試してみましたがわかりません。

編集

精巧な回答と引き換えに、私はそれらをベンチマークすることにしました (そうです、すべてのベンチマークが間違っていることは知っていますが、それでも興味深いものです)。

の出力benchmark-runは次の(time, # garbage collections, GC time)とおりです。

(benchmark-run 10000
  (replace-regexp-in-string "." "bar" "foo.buzz"))

  => (0.5530160000000001 7 0.4121459999999999)

(benchmark-run 10000
  (haxe-replace-string "." "bar" "foo.buzz"))

  => (5.301392 68 3.851943000000009)

(benchmark-run 10000
  (replace-string-in-string "." "bar" "foo.buzz"))

  => (1.429293 5 0.29774799999999857)

replace-regexp-in-string が引用符で囲まれた正規表現に置き換えられます。一時バッファは非常にうまく機能します。

編集 2

今コンパイルで!10倍以上の反復を行う必要がありました:

(benchmark-run 100000
  (haxe-replace-string "." "bar" "foo.buzz"))

  => (0.8736970000000001 14 0.47306700000000035)

(benchmark-run 100000
  (replace-in-string "." "bar" "foo.buzz"))

  => (1.25983 29 0.9721819999999983)

(benchmark-run 100000
  (replace-string-in-string "." "bar" "foo.buzz"))

  => (11.877136 86 3.1208540000000013)

haxe-replace-string は良さそうです

4

5 に答える 5

27

これを試して:

(defun replace-in-string (what with in)
  (replace-regexp-in-string (regexp-quote what) with in nil 'literal))
于 2013-06-26T16:39:07.633 に答える
5

これがより速くなることを望んでいません:

(defun haxe-replace-string (string string-a string-b)
  "Because there's no function in eLisp to do this."
  (loop for i from 0 upto
        (- (length string) (length string-a))
        for c = (aref string i)
        with alen = (length string-a)
        with result = nil
        with last = 0
        do (loop for j from i below (+ i alen)
                 do (unless
                        (char-equal
                         (aref string-a (- j i))
                         (aref string j))
                      (return))
                 finally
                 (setq result
                       (cons (substring string last (- j alen)) result)
                       i (1- j) last j))
        finally
        (return
         (if result 
             (mapconcat
              #'identity
              (reverse (cons (substring string last) result)) string-b)
           string))))

Becasuereplace-regexp-in-stringはネイティブ関数ですが、あなたは決して知りません...とにかく、これは何らかの理由で少し前に書いたので、パフォーマンスを比較したい場合は、試してみてください:)

一時バッファを使用した別のアイデア:

(defun replace-string-in-string (what with in)
  (with-temp-buffer
    (insert in)
    (beginning-of-buffer)
    (while (search-forward what nil t)
      (replace-match with nil t))
    (buffer-string)))
于 2013-06-26T17:51:14.777 に答える