Wie schreibe ich eine Funktion, die mehrere String-Ersetzungen anwendet?

8

Ich möchte eine Funktion replace-several schreiben, die eine Zeichenfolge und eine Reihe von Ersetzungen erhält und alle Ersetzungen anwendet (wobei die Ersetzungen das Ergebnis der vorherigen Ersetzungen sehen).

Ich dachte über die folgende Schnittstelle nach:

%Vor%

Zwei Fragen:

  1. Ist es die idiomatische Schnittstelle in clojure?
  2. Wie implementiert man diese Funktion?

Hinweis: Um einen einzelnen Ersatz zu erstellen, ist replace in verfügbar clojure.string .

    
viebel 05.03.2012, 14:11
quelle

7 Antworten

11

Implementierung von @ kotaraks Empfehlung mit replace , reduce und partition :

%Vor%     
viebel 05.03.2012, 15:33
quelle
8

Sie haben also replace , reduce und partition . Aus diesen Bausteinen können Sie Ihre replace-several erstellen.

    
kotarak 05.03.2012 14:46
quelle
4

Hier ist eine weitere Aufnahme, die jedoch unterschiedliche Ausgabeergebnisse hat. Diese verwendet die Regex-Engine-Funktionen, so dass sie möglicherweise schneller ist, auch die Schnittstelle ist anders, da sie Schlüssel auf Ersetzungszeichenfolgen abbildet. Ich biete dies an, falls es für jemanden mit einer ähnlichen Frage nützlich sein könnte.

%Vor%

Also wäre die Verwendung so:

%Vor%

= & gt; "clj"

    
bmillare 05.03.2012 19:48
quelle
2

Ich bin zu spät zu dieser Party, aber für das, was es wert ist, denke ich, dass die meiste idiomatische Methode darin besteht, Threading und mehrere Ersetzungen zu verwenden:

%Vor%

Die Bedeutung davon ist ziemlich klar, obwohl es nett ist, das mehrfache "Ersetzen" zu vermeiden.

    
danielpcox 19.03.2015 18:33
quelle
1

Sie können reduzieren mit ersetzen:

%Vor%     
Sathish 07.03.2012 05:48
quelle
0

erste Schätzung ..

%Vor%     
djhworld 05.03.2012 15:26
quelle
0

Ich persönlich würde dafür keine separate Funktion erstellen, da es sich nur um eine Zusammensetzung existierender Clojure-Funktionen handelt:

(reduce-kv clojure.string/replace "Hello" {#"[A-Z]" "J", "o" "y"} ;=> "Jelly"

Natürlich, wenn Sie Varargs und eine Schnittstelle wollen, dann:

  1. Ja, es scheint vernünftig idiomatisch zu sein
  2. Ich würde es so implementieren:

(defn replace-many [string & {:as rplcmnts}] (reduce-kv clojure.string/replace string rplcmnts))

    
Peter Westmacott 31.08.2017 10:40
quelle

Tags und Links