2016-08-12 4 views
0

문자 시퀀스 a.b.c이 clojure.string/replace와 함께 a\.b\.c이 되려고 애 쓰고 있습니다. clojure.string 만들기/바꾸기 "a.b.c"를 "a .b c"로 바꾸시겠습니까?

(clojure.string/replace "a.b.c" #"\." "|") 
=> "a|b|c" 

가 왜이 a\.b\.c을 생산하는 데 실패 다음하지 않습니다 ... 감안할 때?

(clojure.string/replace "a.b.c" #"\." "\\.") 
=> "a.b.c" 

내가 찾고 있어요 효과를 얻을 수있는 문자열의 모든 .은 수다를 \. 같은 탈출 .로 대체 ...

(clojure.string/replace "a.b.c" #"\." {"." "\\."}) 
=> "a\\.b\\.c" 

...하지만 얻는다. Clojure 문자열에서 문자가 빠져 나간다는 것을 알았습니다. 당신의 목표는 "\\.""."의 모든 인스턴스를 교체하는 경우

+2

정규식에서 벗어나려고하십니까? 그렇다면 훨씬 더 좋은 방법이 있습니다. – amalloy

+0

@amalloy 나는 동적으로 정규식을 만들려고 노력하고있다. "훨씬 더 나은 방법"은 무엇입니까? –

+1

예를 들어 ['Pattern/quote'] (https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#quote (java.lang.String))는 다음과 같습니다. 좋은 것. – amalloy

답변

1

, 당신은이 작업을 수행 할 수 있습니다 만 백 슬래시 \을 탈출 할 필요가

(require '[clojure.string :as str]) 

(str/replace "a.b.c" "." "\\.") 
;;=> "a\\.b\\.c" 
+0

그래서 제 2의 인수가 단순한 문자열이 아닌 RegEx 패턴이되는 문제가있었습니다. 두 번째 주장은 어쨌든 세 번째 주장에 영향을 미쳤습니까? 저기, 미묘한데. 좋은 대답. 감사. –

+0

@ BobKuhar 두 번째 인수 *로 정규식은 * 합법적 인, 내 대답에 설명했다. 그러나 서로 다른 "오버로드"에는 다른 기능이 있습니다. ''lmostAay igPay atinLay''를 반환하는''(clojure.string/Almost Pig Latin "#"\ b (\ w) (\ w +) \ b ""$ 2 $ 1ay " –

0

참고는 문자열의 내부를 두 번으로 표시 문자 인 경우 -quotes (예 : \의 1 문자 문자열의 경우 "\\").

Clojure를 사용하면 다루기가 더 쉬운 단일 문자 리터럴을 사용할 수 있습니다. 이 문자열에있을 때 (str 사용), 또는 준비하는 것은 이스케이프 버전을 A (prn 사용) 문자열, Clojure의 인쇄로 해석하는 것을

> (def bs \\) 
> bs 
\\ 
> (println bs) 
\ 
> (prn bs) 
\\ 
> (str bs) 
"\\" 

참고. 그러나 println의 경우 이스케이프 처리되지 않은 버전을 인쇄합니다. 우리는 문자 bs 같은 리터럴 도트 \.

> (def str-dot (str \.)) 
> (def str-bs-dot (str \\ \.)) 

> str-dot 
"." 
> str-bs-dot 
"\\." 

> (println str-dot) 
. 
> (println str-bs-dot) 
\. 

> (println (str/replace "a.b.c" str-dot str-bs-dot)) 
a\.b\.c 
1

그것은 replaceAll 이중 이스케이프를 필요로 후드 아래라고 점점과 관련이있다로 시작하는 경우

우리는 모두 탈출을 방지 할 수 있습니다. 자세한 내용은 this answer을 확인하십시오. 원본을 수정하거나 Sam Estep's reply 사용 문자열로 이동, 또는 정규 표현식과 문자열을 사용하여 원래의 시도를 끝까지 따르도록하려면 또한

(clojure.string/replace "a.b.c" #"\." "\\\\.") 
=> "a\\.b\\.c" 
0

을, 정규식 대체를위한 특수 구문이 있습니다 : 당신이 일치하는 데이터를 대체 할 수 있습니다 당신이 다른 문자를 교체 할 때 @Sam Estep의 대답처럼 정말이 사소한 경우

user> (clojure.string/replace "asd.sdf.dfg" #"\." "\\\\$0") 
"asd\\.sdf\\.dfg" 

하지만, 편리하게 : (n은 정규 표현식과 일치 그룹의 인덱스) $n 구문을 사용하여 one pass :

또는 예를 들어210 (오히려 합성 한) 당신은 그것을하기 전에 몇 가지 지표로 표시된 문자를 탈출하려는 :

user> (clojure.string/replace "asd <esc>. ... <esc>| <esc>[" 
           #"<esc>(.)" "\\\\$1") 
"asd \\. ... \\| \\[" 
0

그냥 REPL 출력과 다른, 실제로는 올바른 결과를 외치고있다.

; the string auto escaped in repl display 
boot.user=> (clojure.string/replace "a.b.c" #"\." "\\\\.") 
"a\\.b\\.c" 
; the same string displayed using println function 
boot.user=> (println (clojure.string/replace "a.b.c" #"\." "\\\\.")) 
a\.b\.c 
nil 
관련 문제