2016-05-31 18 views
1

Ich habe dies:Wie Teilstrings ersetzen?

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

Die Funktion

db/get-articles 

eine Liste von Objekten gibt, die den Schlüssel Körper. Ich muss den Körper der Artikel analysieren und ersetzen, falls vorhanden, einen Teilstring "aaa12aaa" mit "bbb13bbb", "aaa22aaa" mit "bbb23bbb" und so weiter in den Körpern. Wie kann ich das tun, so wird es auch nicht viel RAM verbrauchen? Ist Regex effektiv?

UPDATE:

Das Muster, das ich ersetzen müssen, ist: "[etwas =" X "etwas anderes /]". wo X ist eine Zahl und es ist unbekannt. Ich muss X ändern. Es kann viele solche Muster zu ersetzen oder keine geben.

Antwort

4

würde ich nur die Java verwenden String.replace oder String.replaceAll oder clojure.string Funktionen: replace/replace-first.

Ich würde keine Zeit für vorzeitige Optimierungen verschwenden und erst messen, ob die einfache Lösung funktioniert. Ich bin nicht sicher, wie groß die Artikelinhalte sind, aber ich denke, es sollte kein Problem sein.

Wenn es sich herausstellt, dass Sie wirklich optimieren müssen, dann sollten Sie möglicherweise den Inhalt Ihrer Artikel aus dem Datenspeicher streamen und entweder manuell oder mithilfe einer Bibliothek wie streamflyer Änderungen vor Ort durchführen, bevor Sie den Artikel senden Inhalte in den HTTP-Antwort-Stream.

-1

Regex funktioniert gut in 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" 
+1

Beachten Sie auch, dass Sie die "Berechnung" (inc 12) damit tun können: '(clojure.string/ersetzen" xyz-aaa12aaa-def "#" (aaa) (\ d \ d) (aaa) " (fn [[_ _ n _]] (str "bbb" (inc (Ganzzahl/parseInt n)) "bbb"))) ' – cfrick

2

So etwas sollte viel schneller sein:

(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"}]) 

Wenn Sie garantieren können, dass die Zeichenfolge nur auftritt, wenn Sie replace durch replace-first ersetzen können.