2010-04-23 2 views
5

저는 Clojure를 사용 중이므로 Java 정규 표현식의 컨텍스트에 있습니다.따옴표로 묶이지 않은 쉼표와 일치하는 정규식

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

중요한 비트는 각 스트링 후 쉼표이다 : 여기

은 예시 문자열이다. 자바의 replaceAll 메소드로 개행 문자로 대체하고 싶습니다. 정규식은 쉼표로 묶여 있으며 따옴표로 묶이지는 않습니다.

만약 내가 잘 어울리지 않는다면, 물어 보아라. 나는 무엇인가를 행복하게 물어볼 것이다.

편집 : 제목에 혼란스러워서 죄송합니다. 나는 아주 오래 깨어 있지 않았다.

문자열 : {:a "ab, cd efg",} <이 -이 예에서, 마지막에 쉼표가 일치 될 수 있지만, 따옴표 안에있는 사람은 없다.

문자열 : {:a 3, :b 3,} < - 모든 쉼표가 일치합니다.

문자열 {:a "abcd,efg" :b "abcedg,e"} < - 모든 쉼표가 일치하지 않습니다.

+0

모든 쉼표가 일치하는 모든 예제와 하나의 쉼표가 일치하지 않는 예제를 추가 할 수 있습니까? – mkoryak

답변

18

정규식 :

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

일치 :

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

과 :

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

와 쉼표 일치하지 않습니다

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

그러나 탈출 따옴표,과 같이 나타날 수 있습니다 때

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

는 정규식 솔루션은 작동하지 않습니다.

정규식에 대한 간략한 설명 : 즉

,   # 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 

: 제로이있는 쉼표, 또는 (문자열이 끝날 때까지) 앞으로 그것의 인용 부호의 짝수와 일치합니다.

+0

내가 원했던 것과 정반대로 보입니다. : p 문자열에 쉼표가 있거나 일치하지 않는 /와 일치 시키려합니다. :) – Rayne

+0

아, 문자열 안의 따옴표를 이스케이프하지 않았으므로 첫 번째 및 마지막 따옴표가 리터럴의 일부이기도합니다. 내 정규식은 여전히 ​​정확합니다. 내 편집을 참조하십시오. –

관련 문제