2013-03-08 30 views
7

Tôi đang làm việc trên một dự án trong clojure, có thể tương tác với bất kỳ lớp java nào, vì vậy câu trả lời cho câu hỏi của tôi có thể là java hoặc clojure.Java/clojure: Dấu phân tách nhiều ký tự và giữ dấu phân cách

Về cơ bản, tôi cần có khả năng tách chuỗi thành các thành phần dựa trên dấu phân tách đã cho (sẽ có nhiều ký tự) nhưng đồng thời giữ dấu phân tách.

Ví dụ:

splitting "test:test:test" on ":" => [ "test" ":" "test" ":" "test" ] 
splitting "::test::test::" on "::" => [ "::" "test" "::" "test" "::" ] 

Các closets tôi đã đến sử dụng sử dụng clojure của clojure.string/split, nhưng nó không thực sự trả lại delimiters. Cách gần nhất thứ hai là sử dụng StringTokenizer, nó trả về các dấu phân tách nhưng không chấp nhận các dấu phân tách nhiều ký tự.

Có ai biết về bất kỳ giải pháp nào khác sau đó chỉ cần phá vỡ chuỗi thành chuỗi ký tự và chạy một cách kỳ lạ để giảm bớt nó?

Trả lời

8

Dưới đây là một phiên bản đó xây dựng một regex để phù hợp với những khoảng trống trước và sau khi delimiters, thay vì chuỗi delimiter tự (giả sử không có ký tự đặc biệt regex trong d):

=> (defn split-with-delim [s d] 
    (clojure.string/split s (re-pattern (str "(?=" d ")|(?<=" d ")")))) 
#'user/split-with-delim 
=> (split-with-delim "test:test:test" ":") 
["test" ":" "test" ":" "test"] 
=> (split-with-delim "::test::test::" "::") 
["" "::" "test" "::" "test" "::"] 
4
(defn split-it [s d] 
    (interpose d (str/split s (re-pattern d)))) 

(split-it "test:test:test" ":") 
=> ("test" ":" "test" ":" "test") 

(split-it "::test::test::" "::") 
=> ("" "::" "test" "::" "test") 
+0

Thanks for the help nhưng đối với trường hợp thứ hai, tôi cần có dấu phân cách thứ ba vào cuối. –

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