2010-09-16 65 views

回答

5

您可以使用Java的replaceAll方法。呼叫看起來像:

(.replaceAll "text" "(\\d)([ap]m|oclock)\\b" "$1 $2") 

注意這將返回(在紅寶石一樣gsub(沒有爆炸)會)一個新的字符串。因爲Java/Clojure字符串是不可變的,所以在Clojure中沒有相應的gsub!

+0

對不起,我的意思是gsub。感謝這是有道理的。 – Surya 2010-09-16 17:35:53

+0

請修復[replaceAll]的鏈接(http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#replaceAll(java.lang.String,java.lang.String) ) 方法。 – 2012-02-10 07:27:08

+0

@CMPITG剛剛做到了。感謝您的通知。 – sepp2k 2012-02-10 10:56:23

5

這將是在clojure.string命名空間replace。你可以找到它here

使用它,像這樣:

(ns rep 
    (:use [clojure.string :only (replace)])) 
(replace "this is a testing string testing testing one two three" ;; string 
     "testing" ;; match 
     "Mort") ;; replacement 

replace是真棒,因爲比賽和更換,也可以串/串或炭/炭,或者你甚至可以做匹配或字符串的正則表達式/功能。

+0

第二個參數不能是'\ 1 \ 2'(這是一個匹配子串1和匹配子串2)。這是我正在尋找的。 – Surya 2010-09-16 17:34:52

+0

儘管'.replaceAll'可能與'gsub'更加同構,'replace'可以做你想做的事情:如果你使用一個模式(比如你的例子),你可以使用一個函數來處理正則表達式模式的結果,做你想做的。它實際上比'replaceAll'強大得多。 – Isaac 2010-09-16 18:20:55

+0

+1:':use'聲明 – liwp 2012-02-10 14:13:30

25

爲了增加以撒的答案,你這是怎麼會在這個特定的場合使用clojure.string/replace

user> (str/replace "9oclock" 
        #"(\d)([ap]m|oclock)\b" 
        (fn [[_ a b]] (str a " " b))) 
        ; ^- note the destructuring of the match result 
        ;^- using an fn to produce the replacement 
"9 oclock" 

爲了增加sepp2k的答案,這是在使用"$1 $2"你如何利用Clojure的正則表達式文字的優勢噱頭(可以說是比單獨的fn簡單在這種情況下):

user> (.replaceAll (re-matcher #"(\d)([ap]m|oclock)\b" "9oclock") 
        ;   ^- note the regex literal 
        "$1 $2") 
"9 oclock" 
+0

很好的使用破壞沒有想到這一點。但我需要一個更通用的解決方案,所以我要用第二個選項。 – Surya 2010-09-16 19:20:04

+6

實際上我會認爲基於功能的解決方案更加「通用」,但需要花費一定的額外擊鍵。 (想象一下用第一個字符串表示長度來代替第一個字符串:''asdf「' - >''4」';用'$ 1'&Co.不能實現。另一方面,任何你可以用'$ 1'也可以用一個函數完成)。儘管如此,沒有關於更簡單的選項可能更適合的爭論。 – 2010-09-16 20:20:40

+0

感謝您提供示例!我時間不夠,但可能應該讓我的回答更清楚。我也喜歡'replace'函數的普遍性和強大性,但可以看到'.replaceAll'方法的簡單性。 – Isaac 2010-09-16 23:07:56

0

的Clojure的contrib現在有re-gsub如STR-utils的一部分:

user=> (def examplestr (str "jack and jill" \newline "went up the hill")) 
#'user/examplestr 

user=> (println examplestr) 
jack and jill 
went up the hill 
nil 

user=> (println (re-gsub #"\n" " " examplestr)) 
jack and jill went up the hill 
nil 
+0

該鏈接現已死亡。它是否被重命名或刪除? – 2015-12-13 17:12:09