2009-08-31 41 views
46

我有來如字符串:修剪所有字符串數組中的

string email = "[email protected], [email protected], [email protected]"; 

我想將它分割成一個字符串數組

如果我這樣做:

string[] emails = email.Split(','); 

我在每個電子郵件地址前面都有空格(在第一個之後):

emails[0] = "[email protected]" 
emails[1] = " [email protected]" 
emails[2] = " [email protected]" 

什麼是最好的方式來獲得這個(要麼更好的方法來解析或修剪數組中的所有字符串)?在foreach循環

string email = "[email protected], [email protected], [email protected]"; 
string[] emails = email.Split(','); 
emails = (from e in emails 
      select e.Trim()).ToArray(); 
+2

如果空間將在那裏,您可以將它添加到拆分...即:email.Split(','); – nilamo 2009-08-31 04:02:37

回答

24

你也可以取代的空間所有出現,從而避免foreach循環:

string email = "[email protected], [email protected], [email protected]";  
string[] emails = email.Replace(" ", "").Split(','); 
+7

-1(只因爲它被標記爲*答案)答案)雖然這確實將所需的文本放在數組中,但它並不是可用API最具表現力的用法。 – 2009-08-31 04:14:32

+9

@ 280Z28:這不是downvote的理由。 – 2011-07-04 17:26:14

+6

對於此特定示例可正常工作,但不會爲結果元素保留空格,例如; 「foo吧,另一個元素,blah_blah」。布賴恩瓦茨有最好的答案IMO。 – revgum 2012-06-11 14:33:55

7

您可以使用TRIM()。

+0

這個答案是正確的,但是是矯枉過正,這個答案有最好的辦法:http://stackoverflow.com/questions/1355704/trim-all-strings-in-an-array/1355732#1355732 – 2009-08-31 04:07:37

0

或者,也可以使用分割的形式的正則表達式:

\s*,\s* 

string[] emails = Regex.Split(email, @"\s*,\s*"); 

它將直接消耗周圍的空間。

正則表達式通常是一個性能問題,但是您給出的示例表明,這是您計劃在代碼中執行一次短數組的代碼。

8

使用Regex.Split避免修剪

var emails = Regex.Split(email, @",\s*"); 
17

下列任一會的工作之一。我建議第一個,因爲它更準確地表達了連接字符串。

string[] emails = email.Split(new string[] { ", " }, StringSplitOptions.None); 
string[] emails = email.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries); 
+0

+1我不知道有關選項。來自Perl,我看到無處不在的正則表達式。選項Split是要走的路。 – 2009-08-31 04:19:18

+1

+1我們使用LINQ太多了,以致於我們傾向於忘記其他優雅選項的存在。 – 2009-08-31 04:39:41

175
emails.Split(',').Select(email => email.Trim()).ToArray() 
+0

如果你不希望Linq作爲依賴項...... – Moismyname 2015-05-14 17:27:58

+2

@Moismyname:我不確定什麼約束會導致你失敗​​,但還有其他答案可以解決你的問題。 – 2015-05-14 18:55:41

+0

不錯,乾淨。爲我完美工作。謝謝! – CrazyPaste 2015-08-20 17:12:30

5

您可以使用這樣的一個在線解決方案:

string[] emails = text.Split(',', StringSplitOptions.RemoveEmptyEntries); 
Array.ForEach<string>(emails, x => emails[Array.IndexOf<string>(emails, x)] = x.Trim()); 
1

從布賴恩·沃茨答案是優雅而簡潔。他隱式引用由Split()創建的字符串數組。

如果您正在讀取文件並且想在構建陣列時按摩數據,還要注意其可擴展性。

string sFileA = @"C:\Documents and Settings\FileA.txt"; 
string sFileB = @"C:\Documents and Settings\FileB.txt"; 

// Trim extraneous spaces from the first file's data 
string[] fileAData = (from line in File.ReadAllLines(sFileA) 
         select line.Trim()).ToArray(); 

// Strip a second unneeded column from the second file's data 
string[] fileBData = (from line in File.ReadAllLines(sFileB) 
         select line.Substring(0, 21).Trim()).ToArray(); 

當然,如果您願意,也可以使用Linq =>符號。

string[] fileBData = File.ReadAllLines(sFileB).Select(line => 
          line.Substring(0, 21).Trim()).ToArray(); 

儘管我的回答應該已發佈爲評論,但我還沒有足夠的信譽點評論。但是我發現這個討論對於在使用ReadAllLines()時如何處理數據是非常寶貴的。

+0

歡迎來到[SO]。你的代碼中的一小點:如果你像這樣使用Linq,你可能會更好地使用'File.ReadLines'。 'ReadAllLines'將整個文件「鑿鑿」到內存中的一個數組中,這對於大文件來說顯然是有問題的。 「ReadLines」每次只能讀取一行,如果不需要保留內容的初始版本,這非常棒。 – RoadieRich 2016-03-17 21:02:40

+0

謝謝!我可以看到,使用ReadAllLines的示例將在一段時間內分解非常大的文件,同時包含原始數據和內存中的修剪版本。 File.ReadLines()的文檔頁面也有一個適合這個討論的例子。 – RonSanderson 2016-03-21 11:04:37