2010-01-29 19 views
4

它有點推動邊緣,但我有以下情況與此正則表達式 - 「()」:當用於將字符串拆分爲字符串[ ]數組,結果對我來說有點奇怪。例如,這行代碼:正則表達式與一個空組「()」返回奇怪的結果

string[] res = new Regex("()").Split("hi!"); 

res到的9個元素的陣列(!): 「!」[ 「」, 「」, 「H」, 「」, 「I」, 「」, ,「」,「」]

我期待它返回這5個元素:[「h」,「」,「i」,「」,「!」 ]。 我需要這個特定結果的原因是爲了與另一個正則表達式庫兼容...

我的問題是,這種行爲可能是由於正則表達式對象或一些編碼問題或類似的一些丟失選項...或者它是以某種方式確定的,它絕對是它應該工作的正確方式?另外,是否有辦法強制它返回第二個(預期的)結果呢?

+1

你能否澄清被強迫你使用這樣一個奇怪的正則表達式的兼容性問題? – 2010-01-29 03:54:20

+0

+1一個非常有趣的,如果可能無用的問題! – 2010-01-29 03:57:16

+0

我正在深入研究的原因是爲了使它與Ruby正則表達式的工作方式兼容,特別是使IronRuby的規範之一通過。看來雖然在.NET中的實現更加正確... – 2010-02-01 00:04:13

回答

3

我使用|顯示在您的正則表達式將匹配的位置字符: "|h|i|!|"

拆分返回一個數組,其元素都是字符串的開始與所述第一匹配之間,或者最後的匹配和字符串的結尾任一兩個相鄰的匹配之間,或。它按照它們在字符串中出現的順序返回它們。這給出了這個結果: ["","h","i","!",""]

這解釋了9個數組元素中的5個。

但是,「如果在Regex.Split表達式中使用捕獲括號,則捕獲到的任何文本將包含在結果字符串數組中。」 (msdn的直接引用,這裏:http://msdn.microsoft.com/en-us/library/ze12yx1d.aspx

在這種情況下,捕獲的文本是空字符串。由於我們有4場比賽,這解釋了結果中的其他4個元素。

因此,完整的結果是: ["","","h","","i","","!","",""]

+0

謝謝蒂姆,這說明了正在發生的事情。 – 2010-02-03 01:33:02

+0

不客氣。很高興我能幫上忙 – 2010-02-03 18:32:08

3

我會說九個元素是正確的,因爲表達式也匹配「h」之前和「!」之後。

爲了避免匹配的開頭或結尾,你可以添加超前/落後,以確保周圍還有空匹配多個字符:"(?<=.)()(?=.)"

+0

感謝您的前瞻/背後。它使它按我想要的方式工作。 – 2010-02-01 00:10:05