2010-08-02 7 views
3

일부 엑셀 공식을 다른 시스템으로 변환하고 있으며 꽤 멋진 검색을 수행하고 마법을 대체해야합니다. 나는 Regex가이 경우 작업을위한 도구라고 생각하지만, 다른 어떤 아이디어가 있다면 나는 그것들을 듣고 싶다.방정식 찾기 및 바꾸기 (정규식?)

저는이 수식을 SQL 구문과 비슷한 것으로 만들기 위해 노력하고 있습니다. 또한 다음과 같은 대수 기호를 다루어야합니다.

9^2는 POWER (9,2)가되어야합니다. (A + 3)^3이 ((A + 3), 3) POWER가되어야합니다.

가장 좋은 방법은 무엇입니까?

차이가 나는 경우 C# 3.5를 사용하고 있습니다.

편집 : 나는 구문 분석 할 필요가 뭔가의 예 (전원 기호는 거의 다) :

때문에 중첩 된 괄호의 가능성
"((({VAL(9286)}/1000) * {VAL(4648)}) + (({VAL(9609)}/1000) + ({VAL(6480)}/1000)) * {VAL(8574)})/({VAL(9286)}/1000 + {VAL(9609)}/1000 + {VAL(6480)}/1000) * (({VAL(9286)}/22.4)*34.38 + {VAL(9609)} + {VAL(6480)}) * ((1.075068 + 0.001*11.17019 * ((({VAL(9286)}/1000) * {VAL(4648)}) + (({VAL(9609)}/1000) + ({VAL(6480)}/1000)) * {VAL(8574)})/({VAL(9286)}/1000 + {VAL(9609)}/1000 + {VAL(6480)}/1000)+273.15)) + (100000*0.90755/((({VAL(9286)}/1000) * {VAL(4648)}) + (({VAL(9609)}/1000) + ({VAL(6480)}/1000)) * {VAL(8574)})/({VAL(9286)}/1000 + {VAL(9609)}/1000 + {VAL(6480)}/1000) + 273.15)^2))*4.1868/32)" 
+0

표현식이 그보다 복잡 할 수 있습니까 (예 : (a + 3)^(b + 5^(c + 3)))? 그렇다면 정규 표현식이 해당 작업에 가장 적합한 도구가 아닐 가능성이 큽니다. – Jens

+1

예, 그렇습니다. 따라서 제 질문은 할 수 있습니다. 저는 정규 표현식 전문가가 아니며 상징 방정식에 대한 다른 구문 분석 기법에 대해 듣고 싶습니다. – Alex

답변

2

, 정규식이 작업에 적합한 도구가 아닙니다. 수식 파서를 사용하는 것이 좋습니다.

하지만 불가능하지 않습니다. 예를 들어, 반복적으로에 의해 변경되지 않습니다 문자열까지

"POWER($1,$2)" 

와 패턴

((?=[\w.(])[\w.]*\s*(?:\((?>[^()]+|\((?<O1>)|\)(?<-O1>))*(?(O1)(?!))\))?)\s*\^\s*((?=[\w.(])[\w.]*\s*(?:\((?>[^()]+|\((?<O2>)|\)(?<-O2>))*(?(O2)(?!))\))?)

를 교체, POWER(a,b)에 모든 a^b을 설정 할 수 있어야한다. 예 :이 정규식 ^ 가정 것이다

(a+3)^(b+5^(c+3)) + 9^2 + (A + 3)^3 + (5^7)^(6^(8^9-1)-3) 
-> POWER((a+3),(b+5^(c+3))) + POWER(9 ,2)+ POWER((A + 3),3)+ POWER((5^7),(6^(8^9-1)-3)) 
-> POWER((a+3),(b+POWER(5,(c+3)))) + POWER(9 ,2)+ POWER((A + 3),3)+ POWER((POWER(5,7)),(POWER(6,(8^9-1))-3)) 
-> POWER((a+3),(b+POWER(5,(c+3)))) + POWER(9 ,2)+ POWER((A + 3),3)+ POWER((POWER(5,7)),(POWER(6,(POWER(8,9)-1))-3)) 
-> done 

참고 왼쪽 연관되는 대신 마우스 오른쪽 연관의.

1^2^3 
-> POWER(1,2)^3 
-> POWER(POWER(1,2),3) 
-> done 

이지만, 1^2^3 자체는 잘 형성되지 않는다.

+0

응답 해 주셔서 감사합니다. 나는 임의로 긴 방정식을 다루어야한다. 그러나 실제로는 어떤 특별한 경우가 균열을 극복하는지 쉽게 확인할 수 있다고 생각한다. 나는 이것을 줄 것이다. – Alex

+0

이것을 시도했지만 정규식에 실수가있는 것 같습니다. 그것은 pwoer 기호를 대체하지 않습니다. – Alex

+0

.NET Regex.Replace 메서드를 사용하여 어떤 차이가 있습니까? – Alex