2011-07-26 8 views
3

동일한 유형의 개폐 대괄호가 쉼표로 구분되는 동일한 쉼표 구인 과 일치하는 정규 표현식을 갖고 싶습니다.C# 정규 표현식 일치

예를 들어

...

{abc} (def), [ghi], (jkl, mno) 
----------------------------- 
the match should be: 

{abc} (def) 
[ghi] 
(jkl, mno) 

나는 사전을위한 C 번호와 닷넷

덕분에 일하고 있어요! 중첩 된 괄호가없는 경우

+5

를 IMO는 구문 분석 함수를 작성하는 것이 좋습니다 것입니다. –

+0

정규식은 좋지 않은 선택입니다. 원하는 것은 간단한 상태 머신 파서입니다. –

+1

중첩 대괄호가있는 문구는 CFG (Chomsky 2)이고 정규식은 정규 (Chomsky 3) (따라서 REGEX)입니다. 정규 문법으로 CFG를 파싱 할 수는 없습니다. – Hyperboreus

답변

3

, 당신은 사용할 수 있습니다

((?:\{[^}]*\}|\([^)]*\)|\[[^\]]*\])\s*)+ 

string test = "{abc} (def), [ghi], (jkl, mno)"; 
string pattern = @"((?:\{[^}]*\}|\([^)]*\)|\[[^\]]*\])\s*)+"; 
foreach (Match m in Regex.Matches(test, pattern)) 
    Console.WriteLine(m.Value); 

이 인쇄 :

{abc} (def) 
[ghi] 
(jkl, mno) 
+0

OP는 실제로 괄호로 묶이지 않은 쉼표로 분리하는 방법을 묻지 만 이는 분명 더 나은 방법입니다. –

+0

감사합니다. 패턴에 쉼표로 구분할 필요가없는 것은 사실입니다. OP, 콤마 구분이 중요한 경우 대체 패턴'(? <=^|, \ s *) ((? : \ {[^}] * \} | \ ([^)] * \) | \ [[^ \]] * \]) \ s *) + (? = \ s * (? : | $))' – drf

+0

나는 정말로 일반적인 관찰을하고 있었다. 사람들은 'Split()'을 고집하는 경향이 있습니다. 왜냐하면 그 사람들이하고 있기 때문입니다. 그러나 필요한 split 정규 표현식이 엄청나게 복잡한 것으로 밝혀진 곳의 경우에는 'Matches()'접근법을 구현하는 것이 일반적으로 훨씬 쉽습니다. –