2013-02-19 54 views
2

我想用搜索查詢中的加號替換空格字符,我發送到谷歌。Clojure字符串/替換失敗我的功能

(defn search-google [search-term] 
    (clojure.string/replace search-term #" " "+") 
    (browse-url 
     (str "http://google.ca/search?q=" search-term))) 

但是我的功能失敗,因爲我的搜索字詞保留空格。

(search-google "clojure user input") 

URISyntaxException Illegal character in query at index 32: 
http://google.ca/search?q=clojure user input java.net.URI$Parser.fail (:-1) 

我是clojure的新手,懷疑我缺少一些明顯的東西。

回答

3

一個新的固定搜索項被創建的,那麼固定一個被忽略,而不變的一個被傳遞給瀏覽,網址:

(def browse-url println)                                     
(defn search-google [search-term]                                   
    (let [fixed-search-term (clojure.string/replace search-term #" " "+")]                         
    (browse-url                                       
    (str "http://google.ca/search?q=" fixed-search-term)))) 

user> (search-google "a b c")                                    
http://google.ca/search?q=a+b+c                                   
nil  
+0

之間有多個空格的情況,感謝Arthur和@andrewdotnich對「let」的解釋。 – exbctel 2013-02-20 00:28:48

2

試試這個:

(defn search-google [search-term] 
    (browse-url 
    (str "http://google.ca/search?q=" 
     (clojure.string/replace search-term #"\s+" "+")))) 

請注意,該模式是一個正則表達式,你可以使用\s+,表明字符串匹配將被替換應該包括一個或多個空格。

另請注意,替換過程返回一個新的字符串,原始字符串未被修改。

+0

對不起,沒有工作。也許我必須重新綁定「搜索詞」來獲得新的價值。在Python中,它將是'search_term = search_term.replace('','+')' – exbctel 2013-02-19 23:48:29

+0

@exbctel不需要做那個,字符串在作爲參數傳遞之前正確地形成,看它試試這個:'(str 「http://google.ca/search?q=」(clojure.string /替換「abcd」#「\ s +」「+」))'也許在搜索詞中還有其他錯誤的字符? – 2013-02-20 00:23:09

+1

謝謝奧斯卡獎。將'string/replace'移動到'browse-url'工作。然而,我最終使用了Arthur和Andrew建議的'let'重新綁定。 – exbctel 2013-02-20 00:32:08

1

替換不會修改search-term就地,而是返回它的一個副本,它正在被丟棄。

使用let將此值綁定到函數中的名稱,並調用browse-url