如何替换子字符串?

How to replace substrings?

我有这个:

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

函数

db/get-articles

returns 具有键主体的对象列表。我需要解析文章的正文,并在正文中将子字符串 "aaa12aaa" 替换为 "bbb13bbb",将 "aaa22aaa" 替换为 "bbb23bbb" 等等。我该怎么做才不会消耗大量内存?使用正则表达式有效吗?

更新:

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

正则表达式在 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"

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

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

如果事实证明您确实需要优化,那么也许您应该切换到从数据存储中流式传输文章内容,并手动实施替换或使用 streamflyer 之类的库来对在将文章内容发送到 HTTP 响应流之前飞行。

像这样的事情应该很快:

(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-first替换replace