2010-12-06 13 views
6

Lisp'de PHP'nin str_replace benzeri bir işlevi var mı?str_replace?

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

quicklisp yoluyla yükleyin: cl-ppcre adında bir kütüphane bulunmaktadır

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

+0

http://stackoverflow.com/questions/90977/replace-char-in-emacs-lisp kopyası mı? – khachik

+1

Ortak lisp olmalı ve herhangi bir ek kitaplık yüklemek istemiyorum. Ben sadece SLIME var. –

+0

Elisp çözümlerini istemiyorsanız, soruyu elisp ile etiketlememelisiniz. – sepp2k

cevap

15

.

+0

Yaygın lisp olmalı ve herhangi bir ek kütüphane kurmak istemiyorum. Ben sadece SLIME var. –

+0

Ortak lisp, perl-compatibe düzenli ifadeleri içermez çünkü yıllar sonra standart bir özellik haline gelirler. Değiştirme dizesinin basit bir uygulamasını burada bulabilirsiniz: http://cl-cookbook.sourceforge.net/strings.html#manip – koddo

+0

Yararlı Not: Bazı metni ters eğik çizgi ile değiştirmeyi planlıyorsanız daha iyi kullanırsınız Aşağıda cevapla. Bunu cl-ppcre ile değiştirmeyi denedim, ancak bu kolay değil, aslında aşağıda çalışmak bu iş için daha uygun. – MatthewRock

5

Sanırım standartta böyle bir işlev yok. Eğer normal bir ifade (cl-ppcre) kullanmak istemiyorsanız, bu kullanabilirsiniz:

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

DÜZENLEME: Shin Aoyama bu "\\\"" ile, örneğin değiştirilmesi için "\"" çalışmıyor dikkat çekti "str\"ing". Şimdi sıra oldukça hantal yukarıda kabul beri çok daha iyidir Common Lisp Cookbook verilen uygulama, teklif etmeli:

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

Özellikle genellikle concatenate daha iyi performans with-output-to-string kullanımı gibi.

+0

İkinci uygulama, * parça * boş dizgeyse, askıda kalmasına rağmen. Doğru olup olmadığını kontrol etmeli. –

İlgili konular