如何替换子串?

时间:2016-05-31 06:34:41

标签: clojure compojure luminus

我有这个:

(defn page1 []
  (layout/render
   "index.html" 
   ({:articles (db/get-articles)})))

功能

db/get-articles

返回具有键体的对象列表。我需要解析文章的正文并替换(如果存在)带有"aaa12aaa"的子串"bbb13bbb""aaa22aaa""bbb23bbb"的子串,依此类推。我怎么能这样做,所以它也不会消耗大量的RAM?正在使用正则表达式吗?

更新:

我需要替换的模式是:“[something =”X“是别的/]”。其中X是一个数字,它是未知的。我需要换X. 可以有许多这样的模式来替换或没有。

3 个答案:

答案 0 :(得分:3)

我只会使用Java的String.replaceString.replaceAllclojure.string函数:replace / replace-first

如果简单的解决方案有效,我不会浪费时间进行过早优化,并首先进行测量。我不确定文章内容有多大,但我想它不应该是一个问题。

如果事实证明你确实需要进行优化那么也许你应该从数据存储切换到流式传输文章的内容,并手动实现替换或使用像streamflyer这样的库来执行之前的修改将文章内容发送到HTTP响应流。

答案 1 :(得分:1)

这样的事情应该很快:

(mapv
  (fn [{:keys [body] :as m}]
    (assoc m :body
             (reduce-kv
               (fn [body re repl]
                 (string/replace body re repl))
               body
               {"aaa12aaa" "bbb13bbb",
                "aaa22aaa" "bbb23bbb"})))
  [{:body "xy aaa12aaa fo aaa22aaa"}])

如果您可以保证仅在replace替换replace-first之后才会出现该字符串。

答案 2 :(得分:-1)

正则表达式在clojure中表现很好:

(ns clj.core
  (:use tupelo.core)
  (:require
    [clojure.string :as str]
    )

(spyx (str/replace "xyz-aaa12aaa-def" #"aaa12aaa" "bbb13bbb"))

;=>  (str/replace "xyz-aaa12aaa-def" #"aaa12aaa" "bbb13bbb") => "xyz-bbb13bbb-def"