2017-06-04 40 views
0

我工作的一個自定義的數學表達式計算器,但我有在分析這樣一個嵌套條件表達式問題:VB.Net/C# - 自定義功能分割字符串

IIF("M"="M",(IIF(100 < 50,(IIF(2 > 0.45,2,1)),(IIF(2 > 0.45,4,3)))),(IIF(100 < 46,(IIF(2 > 0.45,2,1)),(IIF(2 >0.45,4,3))))) 

我」什麼ð喜歡做的是用逗號,以分裂IIF函數來獲取它的參數:

Dim condition = "M"="M" 
Dim truePart = (IIF(100 < 50,(IIF([2 > 0.45,2,1)),(IIF(2 >0.45,4,3)))) 
Dim falsePart = (IIF(100 < 46,(IIF(2 > 0.45,2,1)),(IIF(2 >0.45,4,3))))) 

目前我使用正則表達式通過獲取什麼是括號和分割這裏面來解析單IIF功能逗號:

\((.*?)\) 

顯然不具有這樣的表達工作,因爲它會在第一個右括號停下來,所以我想過用它來獲取所有其他字符:

\((.*?)\).* 

但現在我不確定如何分割它,因爲使用逗號不再是一個選項。

+2

如果你想解析它,寫一個解析器.. – stuartd

+0

我沒有得到這種答案的好處。我確實寫了一個解析器,但是我在解析上面指定的表達式類型時遇到了問題。 –

+0

好吧,你可以用[this]這樣的東西(http://regexstorm.net/tester?p=IIF%5c%28%28%3f%3a%2c%3f%28%5c%28%28%3f%圖3a%5B%5E%28%29%圖5d%2B%7C%28%3F%3CO%3E%5C%28%29%7C%28%3F%3CO%3E%5C%29%29%29 * %28%3F%280%29%28%3F!%29%29%5℃%29%7C%5B%5E%2C%5D%2B%29%2B%29 *%5C%29&I = IIF%28%22M %22%3D%22M%22%2C%28IIF%28100 +%3C + 50%2C%28IIF%282 +%3E + 0.45%2C2%2C1%29%29%2C%28IIF%282 +%3E + 0.45% 2C4%2C3%29%29%29%29%2C%28IIF%28100 +%3C + 46%2C%28IIF%282 +%3E + 0.45%2C2%2C1%29%29%2C%28IIF%282 +%3E0 .45%2c4%2c3%29%29%29%29%29)但它看起來不正確。對於正則表達式看起來並不合適。 –

回答

0

從理論上的答案是,正則表達式不能做你所要求的,因爲它們「無法計數」。但是,你需要數。

實踐表明,.NET正則表達式不是正則表達式,而是堆棧機器。通過組(?<Group>.*),您實際上會爲該組的堆棧添加條目。使用(?<-Group>),您可以從該堆棧中刪除條目。您也可以測試堆棧是否爲空。

出於好奇,我給它一個嘗試,我相信

[\(,]([^\(\)]|(?<Par>\()|(?<-Par>\)))*(?(Par)---|[,\)])

應該工作,其中---用作轉義序列。如果你馬上明白「正規表達」,那麼我認爲你很好走。在其他所有情況下,我寧願推薦您手動編寫解析器。否則,在測試完5分鐘後,你不會理解你的代碼。

+0

謝謝你的提示!我最終手動解析了表達式,因爲它將更具可讀性,以防將來需要更改某些內容。 –