str_replace в Лиспе? - PullRequest
       5

str_replace в Лиспе?

6 голосов
/ 06 декабря 2010

Есть ли какая-нибудь функция, похожая на PHP str_replace в Лиспе?

http://php.net/manual/en/function.str-replace.php

Ответы [ 2 ]

15 голосов
/ 06 декабря 2010

Существует библиотека с именем cl-ppcre:

(cl-ppcre:regex-replace-all "qwer" "something to qwer" "replace")
; "something to replace"

Установите его через quicklisp .

6 голосов
/ 06 декабря 2010

Я думаю, что в стандарте такой функции нет.Если вы не хотите использовать регулярное выражение (cl-ppcre), вы можете использовать это:

(defun string-replace (search replace string &optional count)
  (loop for start = (search search (or result string)
                            :start2 (if start (1+ start) 0))
        while (and start
                   (or (null count) (> count 0)))
        for result = (concatenate 'string
                                  (subseq (or result string) 0 start)
                                  replace
                                  (subseq (or result string)
                                          (+ start (length search))))
        do (when count (decf count))
        finally (return-from string-replace (or result string))))

EDIT: Шин Аояма указал, что это не работает для замены,например, "\"" с "\\\"" в "str\"ing".Поскольку я считаю вышесказанное довольно громоздким, я должен предложить реализацию, приведенную в Common Lisp Cookbook , которая намного лучше:

(defun replace-all (string part replacement &key (test #'char=))
  "Returns a new string in which all the occurences of the part 
is replaced with replacement."
  (with-output-to-string (out)
    (loop with part-length = (length part)
          for old-pos = 0 then (+ pos part-length)
          for pos = (search part string
                            :start2 old-pos
                            :test test)
          do (write-string string out
                           :start old-pos
                           :end (or pos (length string)))
          when pos do (write-string replacement out)
          while pos)))

Мне особенно нравится использование with-output-to-string, который обычно работает лучше, чем concatenate.

...