clojure相当于ruby的gsub

时间:2010-09-16 17:21:35

标签: regex clojure

我如何在clojure中执行此操作

"text".gsub(/(\d)([ap]m|oclock)\b/, '\1 \2')

4 个答案:

答案 0 :(得分:25)

要添加Isaac的答案,这就是在这个特殊场合使用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"

答案 1 :(得分: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很棒,因为匹配和替换也可以是字符串/字符串或char / char,或者你甚至可以使用匹配或字符串的正则表达式模式/函数。

答案 2 :(得分:5)

您可以使用Java的replaceAll方法。这个电话看起来像是:

(.replaceAll "text" "(\\d)([ap]m|oclock)\\b" "$1 $2")

请注意,这将返回一个新字符串(如ruby中的gsub(没有爆炸))。在Clojure中没有gsub!的等价物,因为Java / Clojure字符串是不可变的。

答案 3 :(得分: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