Как это сделать в clojure
"text".gsub(/(\d)([ap]m|oclock)\b/, '\1 \2')
Как это сделать в clojure
"text".gsub(/(\d)([ap]m|oclock)\b/, '\1 \2')
Вы можете использовать метод Java replaceAll. Вызов будет выглядеть так:
(.replaceAll "text" "(\\d)([ap]m|oclock)\\b" "$1 $2")
Обратите внимание, что это вернет новую строку (например, gsub
(без перерыва) будет в ruby). Нет эквивалента для gsub!
в Clojure, поскольку строка Java/Clojure неизменяема.
Чтобы добавить к Исааку ответ, вот как вы бы использовали 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"
Это будет 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, или вы можете даже создать шаблон/функцию регулярного выражения совпадения или строки.
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