2009-12-22 5 views
2

정규 표현식을 사용하여 수학 표현 파서를 작성 중이며 괄호에 대한 지원을 추가하려고합니다.정규식을 사용하여 괄호 식을 일치시킵니다.

내 파서는 다음과 같이 작동합니다 : 그것은 재귀 그 때문에

function parse_expression(expression){ 
    Find parenthetical expressions 
    Loop through parenthetical expressions, call parse_expression() on all of them 
    Replace parenthetical expression with value of expression 
    Find value of expression 
    Return value 
} 

, 나는 단지 최 괄호 표현을 찾을 필요가있다. 예를 들어 "(5 + (4 + (3 * 2) + 2)) + (1 + 2)"문자열을 구문 분석하는 경우 "5 + (4 + (3/4) + (3 * 2) +2)」및 「1 + 2」로된다. 정규 표현식으로 어떻게 이것을합니까?

"(\ [(^ \)] +) \)") 정규 표현식은 "5 + (4 + (3 * 2)"를 반환합니다. 그리고 두 번째의 아무도를 얻을 수 없습니다.

어떤 아이디어?

감사합니다,

카일 내가 잘못 아니에요 경우가 이론적으로 불가능하므로,이 언어는, 정기적으로하지 않습니다

답변

4

당신이 그것을 모두 반복하고 있기 때문에 나는 여전히 당신이해야한다고 말하고 싶지만 다른 길은입니다. 오히려 가장 큰 사람보다, paranthetical 표현의 작은 하위 집합을 찾기 :

(\([^(]+\)) 

그들을 평가하고, 그 값, 즉로 교체, 처음으로 라운드의 경기는 (3/4), (3 * 2)(1 + 2) 될 것입니다.새 문자열주고, 각각 0,75, 63, 이러한 교체 : 다음

(5 + (4 + 0,75 + 6 + 2)) + 3 

그리고 당신은 반복을 더 이상 괄호 표현이 작업이 될 때까지, 즉 상향식 (bottom-up)이 아니라 여러분과 같은 하향식 (수동으로이 같은 작업을 해결할 것입니다!)보다

기타를, 난 당신이을 요구했다 정확하게는 (실제로 ) 정규 표현식으로 수행 할 수없는 안 하는 모든 다른 사람들과 동의합니다. 그러나 문제은 정규식이 포함 된이 솔루션으로 해결할 수 있습니다.

+0

이것은 영리한 해결책이다. 그것은 많은 문자열 조작을 요구하며, 많은 수를 다시 구문 분석 할 것을 요구할 것입니다, 그러나 그것은 다르게 작동해야합니다. –

+0

나는 그것을 좋아한다. 그것은 위대한 일을해야합니다. 감사. – Kyle

+0

나는 이것을 시도하고 당신이 제공 한 정규 표현식에 대한 약간의 수정이 있어야한다. '(\\ ([^ \\ (] +? \\))'(괄호를 이스케이프하려면 백 슬래시를 추가하고 가능하면 일치 시키려면 물음표를 추가하십시오.) – Kyle

2

정규 표현식으로이 작업을 수행하십시오.

6

임의로 중첩 된 괄호의 언어는 규칙적이 아니므로 정규 표현식을 사용하여 일치시킬 수 없습니다.

특히 정규 언어는 한정된 수의 상태를 갖는 유한 오토마타를 사용하여 구문 분석 할 수있는 언어입니다. 임의로 중첩 된 괄호 세트를 일치 시키려면 괄호가 지나갈 때를 카운트하기 위해 임의의 수의 상태가 필요합니다.

대부분의 "정규 표현식"라이브러리 (특히 perl)는 정규 언어와 엄격하게 일치하지는 않지만 여전히 이러한 제한이 있습니다.

문제를 해결하는 가장 직접적인 방법은 재귀 적 파생 파서입니다. 비효율적 인 방법은 문자열을 살펴보고, 괄호를 계산하여 하위 문자열을 찾아내는 것입니다.

예를 들어 1 + 2 + 3이 아닌 (1 + 2) +3 또는 1+ (2 + 3) 만 허용하는 것과 같이 조작이 괄호로 묶여 있다고 주장하면 구문 분석기가 더 간단 해집니다.

2

파서를 사용해야합니다. 파서가 문자열을 탐색하게하고, 괄호를 찾을 때마다 괄호 개수를 증가시키고 (, 그리고 a에 도달 할 때마다 카운트를 감소시킵니다). 다음에 제로 카운트에 도달하면 가장 바깥 쪽 괄호 식의 범위를 갖게됩니다.

+0

나는 이것을 고려하고 있었지만 David Hedlund의 해결책이 내 문제에 더 잘 맞다고 생각한다. – Kyle

+0

전화하세요. 나는 자신의 솔루션이 더 마음에 든다. D –

관련 문제