Clojure字符串/替换在我的函数中失败

Clojure字符串/替换在我的函数中失败,clojure,Clojure,我想在发送给google的搜索查询中用加号替换空格字符 (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") URISyn

我想在发送给google的搜索查询中用加号替换空格字符

(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的新手,我怀疑我遗漏了一些明显的东西。

试试这个:

(defn search-google [search-term]
  (browse-url 
   (str "http://google.ca/search?q="
        (clojure.string/replace search-term #"\s+" "+"))))
请注意,该模式是一个正则表达式,您可以使用
\s+
指示要替换的字符串匹配应包含一个或多个空格


还要注意,替换过程返回一个新字符串,而原始字符串不会被修改。

replace不会就地修改
搜索词,而是返回它的一个副本,该副本将被丢弃


使用
let
将此值绑定到函数中的名称,并使用该值调用
browse url

正在创建一个新的固定搜索词,然后忽略固定搜索词,并将未更改的搜索词传递到浏览url:

(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    

对不起,那没用。也许我必须将
搜索项
重新绑定到它的新值。在python中,它应该是
search\u term=search\u term.replace(“”,+)
@exbctel无需这样做,字符串在作为参数传递之前格式正确,要查看它,请尝试以下操作:
(str)http://google.ca/search?q=“(clojure.string/replace“abcd”#“\s++”)
搜索词中可能还有其他错误字符?谢谢。将
字符串/replace
移动到
浏览url
工作正常。然而,我最终使用了Arthur和Andrew建议的
let
重新绑定。@exbctel不客气!请记住,
let
是有用的,但不是使代码工作所必需的-您可以直接传递值,如上图所示。还要注意的是,其他答案没有考虑到Anks Arthur和@andrewdotnich之间有多个空格用于解释
let