2016-07-27 3 views
-1

현재 규칙 엔진 프로젝트에 대한 계산 파서 도구를 작성하고 있습니다.정규식 반복 패턴의 다른 부분 그룹화

expression = "5 + 6 - 8" 
expression.split(' '); 

[0]:5 
[1]:+ 
[2]:6 
[3]:- 
[4]:8 

내 코드는이 배열을 사용

계산은 숫자와 연산자를 분리 I 값의 배열로 얻을 사항 String.split를 ('')를 사용 하였다 문자열의 형태를 취 답을 얻으십시오 3 - 현재 저는 왼쪽에서 오른쪽으로 평가를하고 연산자 우선 순위를 다루고 있습니다. 내가 정말 원하는

expression = "12/12/2016 12:00:00 + 30 - 10" 
expression.split(' '); 

[0]:12/12/2016 
[1]:12:00:00 
[2]:+ 
[3]:30 
[4]:- 
[5]:10 

: -

내가 날짜와 함께 작동하도록 계산 문자열 확장하기 위해 찾고 있어요 나는 결과를 얻을 수 있도록 추가 또는 날짜 시간에서 분을 뺀는 불행하게도 내 날짜 시간은 공간이 : 나는 또한 같은 시간에 문자열을 확인할 수 있지만, 불행하게도을 만드는 내 지식이 제한되어 있으므로 정규 표현식을 통해이 문제를 해결하기 위해 기대했다

[0]:12/12/2016 12:00:00 
[1]:+ 
[2]:30 
[3]:- 
[4]:10 

.

누구나 정규 표현식의 예가 있거나 잠재적으로 이렇게 할 수있는 방법에 대한 제안이 있습니까? 숫자와 연산자를 배열에 별도로 저장하는 방법? 아니면 정규 표현식으로는 불가능합니까? 대신 String.Substring()을 사용하여 데이터를 꺼내는 것이 더 낫겠습니까?

편집
SLN 솔루션은 내 문제를 해결, 내 마지막 코드는 다음처럼 보였다 :

var splitExp = Regex.Split(expression, @"[ ](?:(?=\D)|(?<=\D[ ]))"); 

주는 :

내가 찾던 정확히 무엇
expression = "12/12/2016 12:00:00" 
splitExp[0] = "12/12/2016 12:00:00" 

expression = "12/12/2016 12:00:00 + 30 - 10" 
splitExp[0] = "12/12/2016 12:00:00" 
splitExp[0] = "+" 
splitExp[0] = "30" 
splitExp[0] = "-" 
splitExp[0] = "10" 

.

+0

글쎄, 너무 광범위하게 들리지만'Regex.Split (expression, @ "(?! \ d + :)")'시도해 볼 수도 있습니다. 또한 [* .NET에 문자열 수학 평가 프로그램이 있습니까?] (http://stackoverflow.com/questions/355062/is-there-a-string-math-evaluator-in-net) –

+0

^This를 참조하십시오. 정규식이 올바르게 일치하도록하려면 부정적 예측을 사용하십시오. 주어진 코드는 OP가 필요로하는 것과 정확히 같지 않을 수도 있지만, 적어도 OP가 필요로하는 것이기 때문에 출발점으로 사용할 수 있습니다. – Kadima

+0

또한 [* C# *의 수학 표현식 구문 분석 방법] (http://stackoverflow.com/questions/2853907/how-to-parse-math-expressions-in-c)을 참조하십시오. –

답변

-1

필요한 항목은 한쪽 또는 다른 쪽의 숫자가 아예 필요하지 않습니다.
그러면 자리 숫자과 일치하지 않습니다.

(?>[ ]+)(?:(?=\D)|(?<=\D[ ]+)) -

공백이
이에 변화를 가변 수를 기대한다면

[ ](?:(?=\D)|(?<=\D[ ]))

[ ]      # Space to split on 
(?:      # Check if space is valid 
     (?= \D)     # Either a non-digit after it 
    |       # or, 
     (?<= \D [ ])   # A non-digit before it 
) 

확장 된 결과를 얻기 위해 분할과 정규식을 사용하여

+0

이것은 "패턴과 일치하지 않는 모든 것을 내게주세요"라고 말하는 것과 같습니다. - 보는 방법입니다. 내가 결코 생각하지 못한 문제에서. 당신의 솔루션은 대우를 받았기 때문에 마지막 코드는 다음과 같이 보입니다 : var splitExp = Regex.Split (expression, @ "[D]) : (? <= \ D []))"); expression = "12/12/2016 12:00:00 + 30" splitExp [0] = "12/12/2016 12:00:00" splitExp [0] = "+" splitExp [0] = "30" 나는 정확히 내가 원했던 것이다. 감사합니다 - 나는 도움과 정규 표현식의 설명을 주셔서 감사합니다 – QTheIntro

0

더 세련된 방법이 있지만 입력의 사전 처리 방법으로 항상 날짜의 공백으로 토큰을 대체 한 다음 분할 인덱스를 처리 할 때 공백에 대해 대체 백 아웃을 바꿀 수 있습니다 . 예 : 공백에 문자열을 분할하기 전에 (([0-9]{2}/){2}[0-9]{4})()(([0-9]{2}:){2}[0-9]{2})[email protected]@[email protected]@$4으로 바꾼 다음 각 인덱스에서 분할 문자열을 처리 할 때 계속하기 전에 @@[email protected]@을 실제 공간으로 바꿉니다.

+0

그래서 "12/12/2016 @ SPACE @ 12 : 00 : 00 + 30 - 10"과 같은 특수 문자로 공백으로 간주하고 싶지 않은 공백을 교체 한 다음, @ SPACE @는 구문 분석 전에 실제 공간을 나타냅니다. 이것은 나를 위해 일할 것입니다 - 비록 그것이 가장 우아하지 않을 것이라는 데 동의하지만 ... – QTheIntro