2016-07-27 18 views
-1

我正在考慮爲規則引擎項目構建計算解析器工具。將正則表達式分組爲重複模式的不同部分

的計算需要我用string.split(」「)進入值的陣列的字符串的形式,分離值和運算符:

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

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

我的代碼使用此陣列來得到答案3 - 目前我只是從左到右進行評估並處理運算符優先級。

我期待擴展計算字符串日期的工作 - 添加或從日期時間減去分鐘,不幸的是我的DateTime有一個空間,所以我得到的結果是:

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(表達式,@「(?!\ d + :)」)'。此外,請參閱[*是否有一個字符串數學評估器在.NET?*](http://stackoverflow.com/questions/355062/is-there-a-string-math-evaluator-in-net) –

+0

^這。使用負面的lookahead來讓你的正則表達式正確匹配。給定的代碼可能不是OP所需要的,但它可以作爲一個起點,因爲它至少非常接近OP的需求。 – Kadima

+0

另請參閱[*如何在C#*中解析數學表達式](http://stackoverflow.com/questions/2853907/how-to-parse-math-expressions-in-c)。 –

回答

-1

所有你需要的不是一個或另一個數字。
然後它不會匹配數字空格數字

使用正則表達式與拆分得到

[ ](?:(?=\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 
) 

如果預計可變數量的空格
它改變這個結果 -

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

+0

我明白了,所以這就像是說「給我所有與模式不符的東西」 - 這是一種尋找方式在我從未想過的問題上。 你的解決方案工作,所以我最終的代碼看起來像這樣: var splitExp = Regex.Split(expression,@「[](?:(?= \ D)|(?<= \ D []))」 ); expression =「2016/12/12 12:00:00 + 30」 splitExp [0] =「2016/12/12 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