79

我有一个字符串,如下所示:

string email = "a@a.com, b@b.com, c@c.com";

我想把它拆分成一个字符串数组

如果我这样做:

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

我在每个电子邮件地址前面都有空格(在第一个之后):

emails[0] = "a@a.com"
emails[1] = " b@b.com"
emails[2] = " c@c.com"

获得这个的最佳方法是什么(更好的解析方法或修剪数组中所有字符串的方法)?

emails[0] = "a@a.com"
emails[1] = "b@b.com"
emails[2] = "c@c.com"
4

11 回答 11

253
emails.Split(',').Select(email => email.Trim()).ToArray()
于 2009-08-31T04:19:42.640 回答
41

您还可以替换所有出现的空格,从而避免 foreach 循环:

string email = "a@a.com, b@b.com, c@c.com";    
string[] emails = email.Replace(" ", "").Split(',');
于 2009-08-31T04:00:12.943 回答
23

以下任何一项都可以。我推荐第一个,因为它更准确地表达了连接字符串。

string[] emails = email.Split(new string[] { ", " }, StringSplitOptions.None);
string[] emails = email.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
于 2009-08-31T04:01:46.357 回答
11

您可以使用修剪():

string email = "a@a.com, b@b.com, c@c.com";
string[] emails = email.Split(',');
emails = (from e in emails
          select e.Trim()).ToArray();
于 2009-08-31T03:53:47.573 回答
8

用于Regex.Split避免修剪

var emails = Regex.Split(email, @",\s*");
于 2009-08-31T04:01:15.483 回答
5

您可以使用这样的单行解决方案:

string[] emails = text.Split(',', StringSplitOptions.RemoveEmptyEntries);
Array.ForEach<string>(emails, x => emails[Array.IndexOf<string>(emails, x)] = x.Trim());
于 2011-02-10T14:18:40.893 回答
3

如果您只需要操作条目,而不返回数组:

string[] emails = text.Split(',');
Array.ForEach(emails, e => e.Trim());
于 2019-07-18T16:05:03.490 回答
3

.NET 5 已经到来,它是解决这个问题的现代解决方案:

string[] emails = email.Split(',', StringSplitOptions.TrimEntries);
于 2021-01-06T11:15:00.103 回答
2

或者,您可以使用以下形式的正则表达式进行拆分:

\s*,\s*

IE

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

它会直接消耗周围的空间。

正则表达式通常会影响性能,但您提供的示例表明这是您计划在代码中为短数组执行一次的操作。

于 2009-08-31T03:57:37.253 回答
1

Bryan Watts 的回答优雅而简单。他隐含地引用了由 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() 时处理数据非常有用。

于 2016-03-17T20:33:01.157 回答
0

String.Trim在循环中使用foreach,或者如果您使用的是 .NET 3.5+ LINQ 语句。

于 2009-08-31T03:54:53.313 回答