开发者

clojure equivalent for ruby's gsub

开发者 https://www.devze.com 2023-01-16 05:39 出处:网络
How do i do this in clojure \"text\".gsub(/(\\d)([ap]m|o开发者_如何学JAVAclock)\\b/, \'\\1 \\2\')

How do i do this in clojure

"text".gsub(/(\d)([ap]m|o开发者_如何学JAVAclock)\b/, '\1 \2')


To add to Isaac's answer, this is how you would use clojure.string/replace in this particular occasion:

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"

To add to sepp2k's answer, this is how you can take advantage of Clojure's regex literals while using the "$1 $2" gimmick (arguably simpler than a separate fn in this case):

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


You can use Java's replaceAll method. The call would look like:

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

Note that this will return a new string (like gsub (without the bang) would in ruby). There is no equivalent for gsub! in Clojure as Java/Clojure string are immutable.


That would be replace in the clojure.string namespace. You can find it here.

Use it like so:

(ns rep
  (:use [clojure.string :only (replace)]))
(replace "this is a testing string testing testing one two three" ;; string
         "testing" ;; match
         "Mort") ;; replacement

replace is awesome because the match and replacement can also be string/string or char/char, or you could even do regex pattern/function of the match or string.


Clojure contrib now has re-gsub as a part of 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

精彩评论

暂无评论...
验证码 换一张
取 消