2013-01-15 2 views
1

저는 C#으로 공학용 계산기를 만들고 있는데, 사용자가 항목을 추가 할 수있는 선형 함수 모음이 있습니다. 이 수학 함수의 사용법 및 기타 수학 함수를 확인하고 함수 이름과 함수 이름을 추적하고 (...)에있는 수학 식을 미리 구문 분석하고 해당 수학 함수를 평가 결과로 대체해야합니다.선형 함수의 정규식 패턴

예를 들어이 표현을 가지고 : 나는 Regex Tester v1.5.3를 사용하여 테스트

abs(z) avg(x, 5, Ans2) my2ndFunc(y - (x * 2))

:

Ans1+(x*2)-(y^3)+abs(z)-avg(x, 5, Ans2)-my2ndFunc(y - (x * 2)) 

나는 내가 방정식이 일치 할 필요는 내 자신의 정규식을 썼다 하지만 어떤 항목과도 ​​일치하지 않았습니다.
\b([a-z][a-z0-9]*)\((..*)\)\b 

정규 어떤 표현이 함수와 일치하고, 함수 이름 및 매개 변수의 컨텐츠를 저장하는 것입니다 : 이것은 내가 사용하는 정규식? 또한 일치하는 방법에 대한 예제 코드를 제공하고 캡처 그룹의 콘텐츠를 가져 오는 것이 좋겠지 만 필요하지는 않습니다.

편집 나는 내가 입환 야드 알고리즘을 구현 muParser이 실제 수학 파서가 필요하지 않습니다. 난 그냥 간단한 검색을하고 대체해야합니다, 수학 파서가 실제 수학 돌봐, 난 그냥 정규식을 평가할 부분을 찾을 필요합니다. myfuncname(any content here)

+5

가능 *이지만이 * (특이한 어려운 비 휴대용은이기는하지만)이 작업을 수행하는 정규 표현식 ** C# **에서, 나는 그것을 반대하고 대신 간단한 파서를 사용하는 것이 좋습니다. 이는 수식이 항상 정규 언어를 따르지 않을 수 있기 때문입니다. 예를 들어, 한 함수가 다른 함수의 입력으로 중첩되면 어떻게됩니까? 이것은 최근에 C#에서 과학적인 계산기 응용 프로그램을 작성한 사람으로부터 왔습니다. 날 믿어. 파서 (parser)를 사용하면 매우 보잘것 없다. –

+0

@TylerCrompton 이전에 해본 적이있는 muParser 엔진을 사용하여 수학 수식 파싱을 처리하고 클래스에서이 함수에 대한 처리를 작성했습니다. 그리고 중첩 된 함수들에 대해서, 나는 단순히 미리 파싱 함수를 재귀 적으로 만들었다. 하지만 더 이상 프로젝트 파일을 가지고 있지 않아 내가 사용한 정규 표현식을 잊어 버렸습니다. –

+0

백업, 남자. 백업. –

답변

3

내가 내 자신의 정규식

나는 당신이 아주 멀리 정규식받지 않습니다 두렵다을 썼다 :

난 그냥 일치하는 간단한 정규식이 필요합니다. 현명한 사람은 한 번 말했다 :

어떤 사람들은 문제에 직면 할 때,

내가 알고, 나는 정규 표현식을 사용하는 것 같아요.

이제는 두 가지 문제가 있습니다.

체크 아웃 NCalc. 표현식을 파싱하는 과정에 대해 자세히 알고 싶다면 following article을 체크 아웃하십시오.

그리고 직접 구현하려는 경우 Shunting-yard algorithm을 확인하십시오.


UPDATE :

나는 신중하게 질문을 읽지 못했어요 죄송합니다.당신은 입력과 같은

abs(z) 
avg(x, 5, Ans2) 
my2ndFunc(y - (x * 2)) 

는 다음과 같은 사용할 수있는 구문 분석하는 정규식을 찾고 있습니다 :

([a-z][a-z0-9]*)\((.+)\) 
+0

내 다른 주석에서 알 수 있듯이, 나는 정규 표현식을 사용해야한다고 말하는 것이 아니라 모든 공정성에서 정규 표현식을 사용하는 완벽하게 훌륭한 시나리오입니다. 예를 들어, 어휘 분석기에서 정규 표현식을 사용하면 텍스트를 토큰으로 분리 할 수 ​​있습니다. –

+0

필자는 실제 수학 파서가 필요하지 않으며, shunting yard 알고리즘을 구현 한 muParser를 가지고있다. 난 그냥 간단한 검색을하고 대체해야합니다, 수학 파서가 실제 수학 돌봐, 난 그냥 정규식을 평가할 부분을 찾을 필요합니다. –

+0

실제 파서를 직접 만들려는 경우에도 shunting yard 알고리즘은 숫자와 연산자로 구성된 수학 방정식을 파싱하기 때문에 필자의 함수 파싱 상황에 도움이되지 않습니다. 난 그냥 'myfunc (여기에있는 모든 내용)'일치하는 간단한 정규식이 필요합니다 –