2013-07-20 1 views
0

중괄호 안에 표현식 목록이있는 문자열이 있습니다. 배열로 분할하여 세부 사항을 얻고 싶습니다. 나는 이런 식으로 시도했다.perl을 사용하여 중첩 된 중괄호 안에 값을 가져 오는 방법

#!/usr/bin/perl 
sub main() { 
my $string = <STDIN>; 
while ($string =~ /(\((?:(?1)|[^()]*+)++\))|[^()\s]++/g) 
{ 
print "$&\n" 
} 
main(); 

InPut : (+ (+ 4 3) (- 3 2) 5) 
Output should be : (+ (+ 3 4) (- 2 3) 5) 
(+ 3 4) 
(- 2 3) 

나는 배열에 저장하려고 시도하고 다음 seply .. 평가하지만 확실하지 그게 올바른 방법.

기본적으로 아래와 같이 표현식을 평가하려고합니다.

4+3 =7 , 3-2 =1 , and then 7+1+5 = 13 
Final output should be 13 

아무도 친절하게 도와 드릴 수 있습니까?

+2

, 당신은'같은 여러 캡처를 얻을 수없는 것처럼 + (.) '(마지막 문자 만 얻는다). 가장 바깥 쪽 대괄호와 일치 할 수 있으며 해당 내용을 반복적으로 계속 일치시킬 수 있습니다. 하지만 수동으로 이런 식으로 해석하는 것이 더 쉽다고 생각합니다. [이것 좀 봐] (http://www.perlmonks.org/?node_id=997089) –

+0

@ m.buettner : 그다지 어렵지는 않지만 내 대답은 아래를 보라. –

+0

영업 사원이 무제한 중첩을 찾고 있다면 매우 어렵습니다. 정규 표현식은 제한없는 중첩을 수행 할 권한이 없습니다. 파서, 즉 푸시 다운 스택이있는 유한 상태 자동화 만이 작업을 수행 할 수 있습니다. – shawnhcorey

답변

1

를 사용하여 다음의 식 /(?=(\((?>[^()]+|(?1))*\)))/g

여기에 직접보기 : 당신은 동시에 모든 중첩 레벨의 캡처를 얻을 수 http://regex101.com/r/eI7iP5

+0

링크가 깨졌습니다. 수정하십시오. – shawnhcorey

+0

@ shawnhcorey : 그것은 나를 위해 일하고 있습니다. –

+0

이제 정상적으로 작동합니다. 서버가 일시적으로 다운 된 것 같습니다. – shawnhcorey

관련 문제