2013-07-24 10 views
5

クロージャで"*""\*"にエスケープするにはどうすればよいですか?それを動作させるように見えることはできません:Clojureで*を*に置き換える

(s/replace "A*B" #"*" "*")は(もちろん)

(s/replace "A*B" #"*" "\*")が失敗した"A*B"を生成します。Unsupported escape character: *

(s/replace "A*B" #"*" "\\*")が再び"A*B"を生成!

(s/replace "A*B" #"*" "\\\*")失敗:Unsupported escape character: *もう一度!

(s/replace "A*B" #"\\\\*" "*")は、私はそれがA\*B 任意のアイデアを生成するために取得することはできません"A\\*B"

を生成しますか?

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

または、正規表現なしに、それは単にです:

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

re-pattern機能を使用し、正規表現パターンとしてこれを使用するには感謝

答えて

6

あなたは4つのバックスラッシュを使用する必要があります:

> (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

結果: ユーザー=>(clojure.string/"A * B"# "\ *" "\\\\ *"を置換) "A \\ * B" ユーザー=>(clojure.string/replace "A * B" "*" "\\ *") "A \\ * B" 結果を正規表現で使用する必要があります。私はそれを印刷したくない。 – sebi

+0

@sebi私の答えを更新しました。 – sloth

+0

"BLA * BLA"を "BLA \\ * BLA"(この正確な文字列)に置き換えます。残念ながら、あなたが私に与えた例はうまくいきません.... – sebi