2014-04-16 4 views
1

일반적으로 정규 표현식을 찾고 있습니다.Delphi RegEx 괄호 파서

이 정규 표현식은 괄호 문자와 매개 변수를 가져 오는 데 사용됩니다.

입력 :

...alotOfText... 
DBINFO("Parameter1"|'FirstFunction(Parameter)'|Parameter3|SecondFunction("Parameter1"|Parameter2)") 
...alotOfOtherText... 

현재 정규식 : ()이 작동하지만, 최대한 빨리 위의 언급 한 입력을 구문 분석을 필요로하는 단 하나 개의 세트 입력의

cRegex = 
     'DBINFO\('// Looking for DBINFO(
    + '(?:' // Recursion for following Pattern(s) 
    + '[^\)]' // no "(" 
    + '|(?R))' // or Repeat the Recursion (am i right?) I don't really understand this line 
    + '*\)' // Quantifier for recursion (?) with unlimited Chars and one ")" at the end. 
    ; 

일치 항목은 )이 처음 나타날 때까지만 발생합니다.

그래서 여러 수준의 괄호가 서브 루틴을 사용해야한다고 연구했습니다. 그러나 나의 주요 정보원에서도 나는 나를 다시 궤를 같이하는 모범을 발견 할 수 없다. http://www.regular-expressions.info/subroutine.html

비고 :

각 매개 변수와 함께 "또는 함께 빈 될 수있다 '(혼합)

출처 : 당신은 예를 들어 줄 경우

hRegEx := TRegEx.Create(cRegex), [roIgnoreCase, roMultiLine]); 
hMatchCollection := hRegEx.Matches(aLayoutString); 

    for hMatch in hMatchCollection do 
    // Regarding the Regular Expression there should only be one Match in the Collection. 
    //Thats Subject to Change 
    begin 
    if hMatch.Success then 
    begin 
     Result := ParseParameter(hMatch.Value); 
    end; 
    end; 

가 : 광산로에 대해 언급 해주십시오 . 나는 믿고 싶어 .. 아 배운다. :)

+1

StackOverflow에 오신 것을 환영합니다. 내가 올바르게 당신을 이해한다면, 질문은 정규식 자체에 관한 것이며, 맨 아래에 델파이 코드 블록을 추가하는 것 외에는 델파이와 아무 상관이 없습니다. 귀하의 질문이 실제로 델파이에 관한 것이라면, 델파이 * 문제를 해결하려는 도움이 필요한 것이 무엇인지 명확하게하기 위해 [편집] 할 수 있습니까? –

+0

예 신입생입니다. 사용되는 Reg Ex는 Delphi XE 버전입니다. (PCREG?) 저는 현재 버전 0.1을 어떻게 사용하고 있는지 보여주기 위해 소스를 추가했습니다. (표현식을 변경하면 전체 일치하는 그룹을 변경할 수 있기 때문에 ...) – Quelltextknecht

+0

그런 다음 [편집]을 클릭하여 Delphi 태그를 제거하고 PCRE 태그로 바꿉니다. 작동하는 정규 표현식을 얻은 후에는이를 사용하는 Delphi 코드가 거의 동일합니다 (작동하지 않는 경우 해당 문제에 대한 새롭고 다른 질문 *을 갖게됩니다). –

답변

1

발견!

cRegex = 
    'DBINFO'    // some Searchinfo outside the parenthesis Expression 
    + '('     // Outer Match Start for (?1) 
    + '\('    // Search one "(" 
    + '('     // "SubGroup" Start 
    +  '(?>[^()]+)'  // SubPattern: everything that is non-parentheses 
    +  '|(?1)'   // or recursive match of the Subpattern 1 
    + ')'     // "SubGroup" End 
    + '*\)'    // any Numer of "SubGroup" and one ")" 
    + ')'     // Outer Match End 
    ; 

첫 표현식에 잘못되었습니다. Paranthesis Expression 자체는 완벽하게 훌륭했습니다. 그래서 이것은 잘 작동하는 것 같습니다. 더 많은 지식을 가진 사람이 식에 대한 내 의견을 보정 할 수 있다면 http://mushclient.com/pcre/pcrepattern.html#SEC19

:

에서 확인할. 먼저 잘못된 이름을 사용하고 있습니다. 둘째, (? 1)이 Inner() 또는 Outer() Match에 대해 언급하는지 확실하지 않습니다. 그리고 표현식의 형식을 지정하는 법을 모릅니다.