2010-09-16 66 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