2010-12-16 29 views
2

我有具有可通過迭代來解決的解決的問題,但我不知道是否有使用正則表達式和split()基於每次確定性有限自動機達到最終狀態時分割一個字符串?

我有一個字符串(Excel是在剪貼板上投入)是一個更優雅的解決方案,本質上是用逗號分隔的。需要注意的是,當單元格值包含逗號時,整個單元格會被引號包圍(大概是爲了避免該字符串內的逗號)。的示例串如下:

123,12,"12,345",834,54,"1,111","98,273","1,923,002",23,"1,243" 

現在,我想優雅拆分此字符串成單個細胞,但美中不足的是我不能用正常的分裂表達逗號作爲分隔符,因爲它會分裂細胞在其價值中包含逗號。查看這個問題的另一種方法是,如果在逗號前面有一個EVEN引號數,我可以僅用分割逗號。

這很容易用循環解決,但我想知道是否有一個正則表達式.split函數能夠捕獲這個邏輯。爲了解決這個問題,我構建了邏輯的確定性有限自動機(DFA)。

alt text

現在的問題是降低到以下:有一個方法拆分此字符串,使得一個新的數組元素(對應於/秒)每次產生的最終狀態(狀態4在這裏)是通過DFA達成的?

回答

0

使用正則表達式(未逸出):(?:(?:"[^"]*")|(?:[^,]*))

請使用,並調用Regex.Matches(),它是.NET,或其在其他平臺模擬。

你可以進一步擴大上述這樣:^(?:(?:"(?<Value>[^"]*)")|(?<Value>[^,]*))(?:,(?:(?:"(?<Value>[^"]*)")|(?<Value>[^,]*)))*$

這將解析整個串1次射門,但你需要命名組和每組多采集這個工作(.NET支持的話)。

+0

我在VBA這一個我認爲所以我不得不求助於VBScript語法。幸運的是我相信它們非常相似(儘管VBScript實現不支持.Net的後臺功能)。我迫不及待地測試它,謝謝! – Alain 2010-12-16 15:22:08

0

符合條件的逗號也由偶數報價跟隨和VBScript 確實支持向前看符號。嘗試分裂在此:

",(?=(?:[^""]*""[^""]*"")*[^""]*$)"