2011-09-19 47 views
2

我有一個問題,string.split using.NET 3.5:.NET字符串分割方法奇怪的行爲

字符串分割爲:

dim source as string = "ab|foo|bar|bar|bar-foo|ab|ezrezertr|ghghhjhj|ab|foo|xxx|" 
dim result() as string = source.split("ab|") 

當一個WinForms的一個應用中使用,結果是「正確「:

result(0)is」foo | bar | bar | bar-foo |「

result(1)is「ezrezertr | ghghhjhj |」

結果(2)是「foo | xxx |」

我很高興!

當後面的ASP.NET代碼中使用,其結果是:

結果(0)爲 「b | FOO |酒吧|酒吧|杆FOO |」

result(1)is「b | ezrezertr | ghghhjhj |」

結果(2)是「b | foo | xxx |」

換句話說,分割函數只能刪除分隔符字符串的第一個字符! 有人知道爲什麼嗎?

+1

在WinForms,Console或ASP.NET應用程序中使用Split()方法在哪裏沒有區別。 System.String類在每個地方都是一樣的。問題在於你的代碼。 – mironych

回答

5

ASP.NET結果看起來像您使用Regex.Split而不是String.Split。字符串"ab|"將被解釋爲「a」後跟「b」或不存在的正則表達式,因此只需匹配「a」即可。


後來:第二次理論

  • 沒有的String.Split重載接受一個字符串參數。唯一的一個參數超載需要一個數組char
  • String.Splt(char())將分割任何的傳遞的字符。
  • VB,沒有Option Strict On會隱式地將一個字符串轉換爲一個字符數組。

因此,我覺得在ASP.NET情況下,你沒有option strict on,因此theString.Split(anotherString)被視爲theString.Split(anotherString.ToCharArray())

因此分裂只是"b"

但是,這留下了第一種情況如何傳遞字符串的問題,但沒有超過沒有額外的參數(SplitOptions)採取String() ...

摘要:在文件/項目/語言級別設置Visual Basic的額外隱式轉換和行爲可以使相同的代碼具有不同的行爲。

+0

問題是我剛從Winforms代碼複製粘貼到ASP代碼隱藏的功能,然後我可以觀察結果,這是描述。在同一臺計算機或託管服務器上沒有任何區別!該代碼使用string.split並且沒有正則表達式! –

+0

@Didier:我喜歡認爲我是獨一無二的,但我沒有任何特別的知識。只有很多經驗可以解決誤解......我在這裏有第二個理論。 – Richard

+0

感謝理查德,你的「第二理論」必須是正確的,它解釋了行爲上的差異。因此,爲了解決這個問題,我需要做一個字符串=替換(字符串,「AB |」,「#」),然後將結果拆分爲「#」字符...提供這個「#」使用字符因爲分隔符不存在於字符串中的任何地方,情況就是如此。不完美,但會完成這項工作。 –

2

如果輸入的字符串是相同的,那麼我幾乎可以保證你的控制檯應用程序和ASP.NET的拆分方法表現相同。

也許輸出顯示不正確?

+0

嘿理查德,你一定是一個非常難得的人,一個能夠保證微軟代碼的人嗎?大聲笑... –