2010-04-23 42 views
5

Tôi đang sử dụng Clojure, vì vậy đây là ngữ cảnh của các giai đoạn Java.Một regex để khớp với dấu phẩy không được bao quanh bởi dấu ngoặc kép

Dưới đây là một chuỗi ví dụ:

{:a "ab,cd, efg", :b "ab,def, egf,", :c "Conjecture"} 

Các bit quan trọng là những dấu phẩy sau mỗi chuỗi. Tôi muốn có thể thay thế chúng bằng các ký tự dòng mới bằng phương thức replaceAll của Java. Một regex sẽ khớp với bất kỳ dấu phẩy nào không được bao quanh bởi dấu ngoặc kép sẽ làm.

Nếu tôi không giao tiếp tốt, hãy hỏi và tôi sẽ vui vẻ làm rõ mọi thứ.

chỉnh sửa: xin lỗi vì sự nhầm lẫn trong tiêu đề. Tôi đã không tỉnh táo lắm.

Chuỗi: {:a "ab, cd efg",} < - Trong ví dụ này, dấu phẩy ở cuối sẽ được đối sánh, nhưng dấu phẩy bên trong báo giá sẽ không khớp.

Chuỗi: {:a 3, :b 3,} < - Mỗi dấu phẩy khớp duy nhất.

Chuỗi {:a "abcd,efg" :b "abcedg,e"} < - Mỗi dấu phẩy đơn không khớp.

+0

bạn có thể thêm ví dụ trong đó mỗi dấu phẩy khớp và một dấu phẩy không khớp với – mkoryak

Trả lời

18

Các regex:

,\s*(?=([^"]*"[^"]*")*[^"]*$) 

Matches:

{:a "ab,cd, efg", :b "ab,def, egf,", :c "Conjecture"} 
       ^    ^
       ^    ^

và:

{:a "ab, cd efg",} 
       ^
       ^

và không phù hợp với một dấu phẩy trong:

{:a "abcd,efg" :b "abcedg,e"} 

Nhưng khi trích dẫn thoát có thể xuất hiện, như vậy:

{:a "ab,\" cd efg",} // only the last comma should match 

sau đó một giải pháp regex sẽ không hoạt động.

Một lời giải thích ngắn gọn về các regex:

,   # match the character ',' 
\s*   # match a whitespace character: [ \t\n\x0B\f\r] and repeat it zero or more times 
(?=   # start positive look ahead 
    (   # start capture group 1 
    [^"]* #  match any character other than '"' and repeat it zero or more times 
    "  #  match the character '"' 
    [^"]* #  match any character other than '"' and repeat it zero or more times 
    "  #  match the character '"' 
)*   # end capture group 1 and repeat it zero or more times 
    [^"]*  # match any character other than '"' and repeat it zero or more times 
    $   # match the end of the input 
)   # end positive look ahead 

Nói cách khác: phù hợp với bất kỳ dấu phẩy có không, hoặc một số chẵn các dấu ngoặc kép phía trước của nó (cho đến khi kết thúc chuỗi).

+0

Có vẻ như bạn đã làm ngược lại với những gì tôi muốn. : p Tôi muốn khớp với dấu phẩy mà/không phải/trong chuỗi. :) – Rayne

+0

Ah, vì bạn đã không thoát khỏi các dấu ngoặc kép bên trong chuỗi của bạn, tôi giả định rằng báo giá đầu tiên và cuối cùng cũng là một phần của chữ của bạn. Regex của tôi vẫn chính xác, btw. Xem chỉnh sửa của tôi. –

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