2009-08-31 61 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