如何替换子字符串?
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.replace
或 String.replaceAll
或 clojure.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
。
我有这个:
(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.replace
或 String.replaceAll
或 clojure.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
。