2010-09-16 27 views

Trả lời

5

Bạn có thể sử dụng phương thức replaceAll của Java. Cuộc gọi sẽ có dạng như sau:

(.replaceAll "text" "(\\d)([ap]m|oclock)\\b" "$1 $2") 

Lưu ý rằng điều này sẽ trả lại một chuỗi mới (như gsub (không có tiếng nổ) sẽ bằng ruby). Không có tương đương với gsub! trong Clojure vì chuỗi Java/Clojure là không thay đổi.

+0

yea xin lỗi tôi có nghĩa là gsub. Cảm ơn điều này có ý nghĩa. – Surya

+0

Vui lòng sửa liên kết tới [replaceAll] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#replaceAll (java.lang.String, java.lang.String)) phương pháp. –

+0

@CMPITG. Cảm ơn thông báo. – sepp2k

5

Đó sẽ là replace trong không gian tên clojure.string. Bạn có thể tìm thấy nó here.

Sử dụng nó như vậy:

(ns rep 
    (:use [clojure.string :only (replace)])) 
(replace "this is a testing string testing testing one two three" ;; string 
     "testing" ;; match 
     "Mort") ;; replacement 

replace là tuyệt vời bởi vì trận đấu và thay thế cũng có thể là chuỗi/chuỗi hoặc char/char, hoặc thậm chí bạn có thể làm regex mô hình/chức năng của trận đấu hoặc chuỗi.

+0

Đối số thứ hai không thể là '\ 1 \ 2' (đó là một đối sánh chuỗi con 1 và khớp với chuỗi con 2). Đó là những gì tôi đang tìm kiếm. – Surya

+0

Mặc dù '.replaceAll' có thể đồng nhất với' gsub', 'replace' có thể làm những gì bạn muốn: nếu bạn sử dụng mẫu (như trong ví dụ của bạn), bạn có thể sử dụng hàm để xử lý kết quả của mẫu regex và làm bất cứ điều gì bạn muốn. Nó thực sự mạnh hơn một chút so với 'replaceAll'. – Isaac

+0

+1 cho khai báo ': use' – liwp

25

Để thêm vào câu trả lời Isaac, đây là cách bạn sẽ sử dụng clojure.string/replace trong dịp đặc biệt này:

user> (str/replace "9oclock" 
        #"(\d)([ap]m|oclock)\b" 
        (fn [[_ a b]] (str a " " b))) 
        ; ^- note the destructuring of the match result 
        ;^- using an fn to produce the replacement 
"9 oclock" 

Để thêm vào câu trả lời sepp2k, đây là cách bạn có thể tận dụng lợi thế của literals regex Clojure trong khi sử dụng các "$1 $2" mánh lới quảng cáo (cho là đơn giản hơn một riêng biệt fn trong trường hợp này):

user> (.replaceAll (re-matcher #"(\d)([ap]m|oclock)\b" "9oclock") 
        ;   ^- note the regex literal 
        "$1 $2") 
"9 oclock" 
+0

Sử dụng tốt việc hủy diệt đã không nghĩ đến điều đó. Nhưng tôi cần một giải pháp chung chung hơn vì vậy tôi đang đi với các tùy chọn thứ hai. – Surya

+6

Thực ra tôi đã nghĩ rằng giải pháp dựa trên chức năng là "chung chung" hơn, với chi phí của một số lần nhấn phím nhất định. (Hãy tưởng tượng thay thế các nhóm đầu tiên bằng biểu diễn chuỗi có chiều dài của nó: '" asdf "' -> '" 4 "'; không thực sự có thể làm được với '$ 1' & Co. Mặt khác, bất cứ điều gì bạn có thể làm với' $ 1' cũng có thể được thực hiện với một hàm.) Không có đối số về tùy chọn đơn giản hơn có thể phù hợp hơn ở đây, mặc dù. –

+0

Cảm ơn bạn đã cung cấp một ví dụ! Tôi đã có thời gian ngắn, nhưng có lẽ nên làm cho câu trả lời của tôi rõ ràng hơn. Tôi cũng vậy, giống như tính tổng quát và sức mạnh của hàm 'replace', mặc dù có thể thấy sự hấp dẫn của sự đơn giản của' .replaceAll'. – Isaac

0

Clojure contrib hiện có re-gsub như một phần của str-utils:

user=> (def examplestr (str "jack and jill" \newline "went up the hill")) 
#'user/examplestr 

user=> (println examplestr) 
jack and jill 
went up the hill 
nil 

user=> (println (re-gsub #"\n" " " examplestr)) 
jack and jill went up the hill 
nil 
+0

Liên kết đó hiện đã chết. Nó có được đổi tên hoặc xóa không? –

Các vấn đề liên quan