2012-04-04 5 views
-2

정규 표현식 작성시 약간의 문제가 있습니다. 예상 입력 :'포함하지 않음'정규 표현식을 만드는 방법

blahblahblah, blahblahblah, 'blahblahblah', "blahblahblah, asdfd" 

쉼표로 구분 된 단어를 배열로 가져와야합니다. 하지만 split 함수를 사용할 수 없기 때문에 쉼표가 문자열에서도 발생할 수 있습니다. 그래서, 예상 출력은 다음과 같습니다.

arr[0] = blahblahblah 
arr[1] = blahblahblah 
arr[2] = 'blahblahblah' 
arr[3] = "blahblahblah, asdfd" 

아무도 정규 표현식을 사용하거나 다른 솔루션을 사용하여 비슷한 결과를 얻을 수 있습니까? 도와주세요.

+0

입력 한 단어를 쉼표로 구분하면됩니다. – user35443

+0

.. 나는 그것을 나눌 수 없다. – user35443

+2

은 (는) CSV 형식과 유사합니다. – Jodrell

답변

0

제한된 문제를 고려할 때 이와 같은 작업을 수행 할 수 있습니다. Regex는 더 짧고 더 간단합니다. 대신 자신의 CSV 파서 롤링의

string line = <YourLine> 
var result = new StringBuilder(); 
var inQuotes = false; 

foreach(char c in line) 
{ 
    switch (c) 
    { 
     case '"': 
      result.Append() 
      inQuotes = !inQuotes; 
      break; 

     case ',': 
      if (!inQuotes) 
      { 
       yield return result.ToString(); 
       result.Clear(); 
      } 

     default: 
      result.Append() 
      break;     
    } 
} 
+0

** user35443 **는'''뿐만 아니라'''도 지원합니다. 표준 동작이 아닐지라도 ... –

+0

이 글을 읽기 전에 해봤지만 – user35443

+0

@ user35443 - 그렇다면 질문을 편집하는 것이 좋습니다. 질문에 대한 대답이 아닌 다른 대답을 받아 들였기 때문입니다. 그리고 다른 독자들도 여기에 있으므로 혼동하지 마십시오. –

0

나는이 가장 최적 모르겠지만, 당신이 http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx에 케이스를 테스트에서 올바른 출력을 생산 :

(?>"[^"]*")|(?>'[^']*')|(?>[^,\s]+) 

C# 문자열 버전 : 가능

@"(?>""[^""]*"")|(?>'[^']*')|(?>[^,\s]+)" 
+0

+1 원자 그룹에 대해 가르쳐주세요. – Robbie

+0

** "첫 번째" "항목", "두 번째 항목", 세 번째 항목에 ** ** 작동하지 않습니다. –

+0

@stackoverflow - 예, 기대하지 않았습니다. 따옴표로 묶인 문자열에는 유사한 인용 부호가 포함되어서는 안됩니다. 앞에서 말했듯이, 주어진 (제한된) 테스트 케이스에 대해 정확한 출력을 산출합니다. – FishBasketGordo

0

하나 접근법은 쉼표 (RegEx가 아닌 string.Split 사용)로 분할 한 다음 결과를 반복하는 것입니다. 0 또는 2 ' 또는 "자를 포함하는 각 결과에 대해 새 목록에 추가하십시오. 결과에 1 ' 또는 "이 포함 된 경우 결과가 2 ' 또는 "이 될 때까지 다음 항목을 추가 (쉼표 추가) 한 다음 새 목록에 추가하십시오.

+0

아, 그게 간단한 해결책입니다. –

+0

@MooingDuck - 너 심각해? –

+0

@stackoverflow : 이것은 가장 빠르거나 가장 우아한 답변은 아니지만 이해하기가 쉽고 올바른 결과를 얻을 수 있습니다. Regexes가 나를 넘어서서 나머지 응답을 확인할 수 없습니다. 이것과 Jodrell이 할 수있는 유일한 제안입니다. –

0

은 표준 사용을 고려 아웃 - 오브 - 박스 TextFieldParser class 그 .NET 프레임 워크와 함께 제공.

또는 Microsoft Ace 및 OleDbDataReader를 사용하여 ADO.NET을 통해 파일을 직접 읽을 수 있습니다. 샘플은 다른 게시물 인 like this one에서 찾을 수 있습니다. 샘플로 사용할 수있는 older post on CodeProject이 있습니다. 이전 Jet.OLEDB.4.0 드라이버 대신 최신 Ace 드라이버를 참조하고 있는지 확인하십시오.

이러한 옵션은 사용자 지정 내장 파일 파서보다 장기적으로 유지 관리하기가 훨씬 쉽습니다. 그리고 그들은 잘 문서화되지 않은 CSV 포맷을 둘러싸고있는 많은 코너 케이스를 처리하는 방법을 이미 알고 있습니다.

관련 문제