2014-11-07 4 views
1

나는 문자열 분할 사용이 정규식이 :이 정규식에 대한 설명이 필요

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

예를 문자열

"필드 1", "필드 2", "항목 1, 항목 2, 항목 3", "안녕하세요", "존" ""

한 나는 그것이에 문자열을 분할되어 이해 것,하지만 아무것도 후 나는 잘 모르겠다.

누구든지이 Regex를 설명 할 수 있으면 바랍니다.

가능한 가장 단순한 수준으로 해부 할 수 있다면 감사하게 생각합니다.

답변

4

이 정규식은 쉼표는 문자 , 후 따옴표도 수를 계산하여 외부 따옴표 경우에만 ,일치한다. (?=(?:[^"]*"[^"]*")*[^"]*$)이 엄마는 다음과 같습니다


설명 :

, -> match literal comma 
(?=...) -> positive lookahead 
[^"]*" -> match anything before a " followed by a literal " 
[^"]*"[^"]*" -> match a pair of above 
(?:[^"]*"[^"]*")* -> Match 0 or more of pairs (0, 2, 4, 6 sets) 
[^"]*$ -> Followed by any non-quote till end of string 

예 입력 : 내다가 있기 때문에

"Field1,Field2","Field3","item1,item2,item3" 
  • 첫째는 "Field3" 전에 , 일치합니다 왕이 쉼표 뒤에 4 큰 따옴표가 있는지 확인하십시오.
  • 두 번째로는 이후에 "Field3"과 일치 할 것입니다. 왜냐하면 lookahead : (?=(?:[^"]*"[^"]*")*[^"]*$)이이 쉼표 뒤에 큰 따옴표 2 개가 있는지 확인하기 때문입니다.
  • 이후의 따옴표 숫자가 홀수이므로 (?=(?:[^"]*"[^"]*")*[^"]*$) 미리보기가 실패하므로 Field1Field2 사이에 쉼표가 일치하지 않습니다.
+0

나는 그 부분을 이해하지만 그것을 부분적으로 이해할 필요가 있기 때문에 나 자신과 비슷한 것을 만들 수있다. – gbs

+0

좋아, 내가 좀 더 설명을 추가했는데, 그것이 명확하지 않은 경우 알려줘. – anubhava

+0

감사합니다. 좀 더 이해가되었지만 위의 예제 문자열을 사용하여 좀 더 설명 할 수는 있습니다. – gbs

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

" 내부에있는 및 " .This 모든 ,something " something" 낭포의 그룹을 효과적으로 ,"" 사이가 될 수 없습니다가 될 것이라고 말했다 ,에 분할되지 않습니다.

+0

감사합니다 ... 그 부분을 이해하지만 부분적으로 이해해야하므로 직접 비슷한 것을 만들 수 있습니다. – gbs

+0

@gbs'','''와'''사이에있는 경우, 그것보다 앞서서 홀수의'''를 가질 것입니다. 외부에 있다면 그것보다 짝수의'''를 가질 것입니다. 도움이된다. – vks