2013-02-19 55 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