Clojure эквивалент для ruby ​​gsub

Как это сделать в clojure

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

Ответ 1

Вы можете использовать метод Java replaceAll. Вызов будет выглядеть так:

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

Обратите внимание, что это вернет новую строку (например, gsub (без перерыва) будет в ruby). Нет эквивалента для gsub! в Clojure, поскольку строка Java/Clojure неизменяема.

Ответ 2

Чтобы добавить к Исааку ответ, вот как вы бы использовали 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, вы можете использовать литералы Clojure regex, используя трюк "$1 $2" (возможно, в этом случае проще, чем отдельный fn):

user> (.replaceAll (re-matcher #"(\d)([ap]m|oclock)\b" "9oclock")
                   ;           ^- note the regex literal
                   "$1 $2")
"9 oclock"

Ответ 3

Это будет replace в пространстве имен clojure.string. Вы можете найти здесь здесь.

Используйте его так:

(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, или вы можете даже создать шаблон/функцию регулярного выражения совпадения или строки.

Ответ 4

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