Clojure:在字符串中插入字符的惯用法

时间:2013-05-16 03:48:00

标签: string clojure concatenation

我在Clojure中有一个字符串,我想在第n个和第(n + 1)个字符之间添加一个字符。例如:假设字符串是“aple”,我想在“p”和“l”之间插入另一个“p”。

  (prn 
     (some-function "aple" "p" 1 2)) 

  ;; prints "apple" 
  ;; ie "aple" -> "ap" "p" "le" and the concatenated back together.

我发现这有点挑战性,所以我想我缺少一些有用功能的信息有人可以帮我写上面的“some-function”,它带有一个字符串,另一个字符串,一个起始位置和结束位置并将第二个字符串插入起始位置和结束位置之间的第一个字符串中?提前谢谢!

1 个答案:

答案 0 :(得分:11)

比使用seq函数更有效:

(defn str-insert
  "Insert c in string s at index i."
  [s c i]
  (str (subs s 0 i) c (subs s i)))

来自REPL:

user=> (str-insert "aple" "p" 1)
"apple"

NB。此函数实际上并不关心c的类型,或者字符串的长度; (str-insert "aple" \p 1)(str-insert "ale" "pp" 1)也会工作(通常会使用(str c),如果cnil则为空字符串,否则为(.toString c) )。

由于这个问题需要一种惯用的方式来执行手头的任务,我还会注意到我发现在交易时使用面向字符串的函数更好(除了性能优势之外的“语义匹配”)特别是字符串;这包括subs和来自clojure.string的函数。有关惯用字符串处理的讨论,请参阅the design notes at the top of the source of clojure.string