Clojure的等效红宝石的GSUB
您可以使用Java的replaceAll方法。呼叫看起来像:
(.replaceAll "text" "(\\d)([ap]m|oclock)\\b" "$1 $2")
注意这将返回(在红宝石一样gsub
(没有爆炸)会)一个新的字符串。因为Java/Clojure字符串是不可变的,所以在Clojure中没有相应的gsub!
。
这将是在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
是真棒,因为比赛和更换,也可以串/串或炭/炭,或者你甚至可以做匹配或字符串的正则表达式/功能。
为了增加以撒的答案,你这是怎么会在这个特定的场合使用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"
很好的使用破坏没有想到这一点。但我需要一个更通用的解决方案,所以我要用第二个选项。 – Surya 2010-09-16 19:20:04
实际上我会认为基于功能的解决方案更加“通用”,但需要花费一定的额外击键。 (想象一下用第一个字符串表示长度来代替第一个字符串:''asdf“' - >''4”';用'$ 1'&Co.不能实现。另一方面,任何你可以用'$ 1'也可以用一个函数完成)。尽管如此,没有关于更简单的选项可能更适合的争论。 – 2010-09-16 20:20:40
感谢您提供示例!我时间不够,但可能应该让我的回答更清楚。我也喜欢'replace'函数的普遍性和强大性,但可以看到'.replaceAll'方法的简单性。 – Isaac 2010-09-16 23:07:56
的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
该链接现已死亡。它是否被重命名或删除? – 2015-12-13 17:12:09
对不起,我的意思是gsub。感谢这是有道理的。 – Surya 2010-09-16 17:35:53
请修复[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
@CMPITG刚刚做到了。感谢您的通知。 – sepp2k 2012-02-10 10:56:23