2013-07-24 13 views
5

Jak mogę uciec przed "*" do "\*" w clojure? nie wydaje się uzyskać go do pracy:Zamień * na * w Clojure

(s/replace "A*B" #"*" "*") produkuje "A*B" (oczywiście)

(s/replace "A*B" #"*" "\*") zawiedzie: Unsupported escape character: *

(s/replace "A*B" #"*" "\\*") produkuje "A*B" ponownie!

(s/replace "A*B" #"*" "\\\*") ponownie: Unsupported escape character: * ponownie!

(s/replace "A*B" #"\\\\*" "*") produkuje "A\\*B"

nie mogę zmusić go do produkcji A\*B pomysłów? Dzięki

Odpowiedz

6

Musisz użyć 4 backslashy:

> (println (clojure.string/replace "A*B" #"\*" "\\\\*")) 
A\*B 
nil 
> 

lub bez regex, to po prostu:

> (println (clojure.string/replace "A*B" "*" "\\*")) 
A\*B 
nil 
> 

Aby użyć tego jako wzorzec regex, użyj funkcji re-pattern :

> (def p (clojure.string/replace "A*B" #"\*" "\\\\*")) 
#'sandbox17459/p 
> (println p) 
A\*B 
nil 
> (clojure.string/replace "BLA*BLA" (re-pattern p) "UH") 
"BLUHLA" 
> 
+0

Działa to tylko, gdy pr int wynik: użytkownik => (clojure.string/replace "A * B" # "\ *" "\\\\ *") "A \\ * B" użytkownik => (clojure.string/replace "A * B" "*" "\\ *") "A \\ * B" Muszę użyć wyniku w wyrażeniu regularnym. Nie chcę tego drukować. – sebi

+0

@sebi Zaktualizowałem swoją odpowiedź. – sloth

+0

Chcę zamienić "BLA * BLA" na "BLA \\ * BLA" - dokładnie ten ciąg. Smutno, przykład, który mi dałeś, nie działa ... – sebi