2009-02-27 2 views
1

, 하나는 같은 것을 사용하여 괄호 그룹을 찾을 수 있습니다 다음과 같은 그룹으로.net 정규식에서 괄호 안에없는 쉼표를 찾는 방법은 무엇입니까? .NET에서 제공하는 몇 가지 확장 기능을 사용

Func(innerfunction(arg)).DoSomething() 

:

^(\w+)\(((?>[^()]+|\((?<D>)|\)(?<-D>))*(?(D)(?!)))\)(.*)$ 

이 다음과 일치합니다

  • 그룹 1 : Func
  • 그룹 2 : innerfunction (arg)
  • 그룹 3 : .DoSomething()

내 질문, 어떻게 그들이 괄호 그룹 내부 또는하지 않을 경우 고려, 쉼표와 일치 할 수있다? 예를 들어, 정규식 평가하기 :

Func(innerFunction(arg1, arg2), arg3).DoSomething() 

항복해야 :

  • 그룹 1 : Func을
  • 그룹 2 : innerFunction (ARG1, ARG2)
  • 그룹 3에서 arg3
  • 그룹 4 : .DoSomething()

감사합니다.

답변

0

나는 그것을 발견했다고 생각한다.

func1(arg2, func3(arg3, arg4)), func2(arg5, arg6).property 

등 :

  • 그룹 1 : FUNC1 (ARG2, func3 (에서 arg3, arg4))
  • 이이 표현을 일치

    ^([^()]*?|.*\((?>[^()]+|\((?<D>)|\)(?<-D>))*(?(D)(?!))\).*?),(.*)$ 
    

    : 사람이 카운터 예제가 있습니까

  • 그룹 2 : func2 (arg5, arg6). 속성

이 솔루션은 하나의 쉼표 만 찾지 만 임의의 깊이의 괄호를 처리합니다.

UPDATE :

  • 그룹 1 : FUNC1 ((ARG1)
  • 그룹 2 : ARG2), FUNC2

    func1((arg1), arg2), func2(arg3).property 
    

    가의가에 분할 취득 : 검보는 카운터 - 예를 제공하고 있습니다 (arg3).부동산

그러나 : 비 욕심에 "모든 경기"처음으로 돌려, 하나는 그것을 해결할 수 :

^([^()]*?|.*?\((?>[^()]+|\((?<D>)|\)(?<-D>))*(?(D)(?!))\).*?)\s*,\s*(.+)$ 

다른 카운터 - 예?

+0

"func1 ((arg1), arg2), func2 (arg3) .property" "func1 ((arg1)"및 "arg2", func2 (arg3) .property "(에 따라). – Gumbo

+0

지금은 어떨까요? ;-) –

+1

"func1 (") ", arg1), func2(). property"와 같은 것은 어떨까요? – Gumbo

0

불가능하지는 않지만 정규 표현식을 사용하지 않는 것이 좋습니다.

문제는 표현이 완전히 탐욕 스럽거나 탐욕스럽게 느껴지는 경향이 있다는 것입니다. 최대한 일치 할

(A) (B), (C, (d) E)

욕심 식 예를 들어, 다음의 입력을 받아. 이 괄호 안에있는 것으로 표시되므로 을 반환하지 않습니다..

ungreedy 표현식은 쉼표 b와 정확하게 일치하지만, (c,(d,)이 하나의 완전한 그룹으로 표시되기 때문에 쉼표와도 일치합니다.

이제는이 문제를 이미 이해하고 있으며 .Net 정규 표현 엔진에이 기능을 어느 정도 지나치게 사용할 수있는 기능이 있다고 들었습니다. 그러나 결과 표현은 추악하고, 유지가 어렵고, 휴대하기가 쉽지 않으며, 잘못되기 쉽습니다. 자신이하는 일을 정말로 안다면 다른 해결책을 찾는 것이 가장 좋습니다.

0

중첩 깊이를 제한하지 않으려면 정규식만으로는 불가능합니다.

따라서 중첩 수준을 구분하는 파서를 작성하는 것이 좋습니다. 문자 단위로 입력 된 문자를 읽습니다. '('의 경우 레벨을 높이고 레벨이 ')'이면 레벨이 내려 가고 ','이 분할됩니다.

+0

조언 해 주셔서 감사합니다. 어떤 counter-example? –

+0

+1. 정규 표현식은 임의 깊이 네 스팅을 다룰 수 없으며, 다른 종류의 파서가 필요합니다. – bobince

+0

제시된 해결책이 문제를 해결한다는 것을 계속 주장합니다. 임의 깊이 네스트는 계산 전략 :) 반례를 부탁드립니다. –

관련 문제