修剪数组中的所有字符串


70

我有一个像这样的字符串:

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"

2
如果空间始终存在,则可以将其添加到拆分中...即:email.Split(',');
nilamo

Answers:


42

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

string email = "a@a.com, b@b.com, c@c.com";    
string[] emails = email.Replace(" ", "").Split(',');

12
对于这个特定的示例,可以正常工作,但是不会为诸如此类的结果元素保留空间;“ foo bar,另一个元素,blah_blah”。布莱恩·瓦茨(Bryan Watts)是IMO的最佳答案。
revgum 2012年

1
嗨@revgum!没错,但我坚持遵守@leora的要求。您正在描述的示例IMO不在此问题的范围内。无论如何,谢谢您的反馈。
nick2083 2012年

2
-1我同意这不是一件好事。买家当心。
Scott Adams

也被否决了。我同意答案能解决问题,但Bryans的答案通常更有用
Joris Van Regemortel 2014年

这是不对的。它不会修剪,但是会从数组中的字符串中删除空格,这与修剪(删除尾部和前导空格)完全不同
SimpleGuy

236
emails.Split(',').Select(email => email.Trim()).ToArray()

3
@Moismyname:我不确定哪种约束会导致您走这条路,但是还有其他答案可以解决您的问题。
布莱恩·瓦茨

干净整洁。为我完美地工作。谢谢!
KidBilly

第一:非常好的解决方案!关于OP的问题,不是应该email.Split(...)...代替emails.Split(..)...吗?我认为电子邮件已经是拆分数组。
klaas

8
这好于接受的答案,因为问题是对每个字符串进行TRIM,而不必用空格替换空格。
daveD

1
@MinhTran它确实是一个函数调用-Select是在System.Linq命名空间中组成LINQ的一系列扩展方法。
布莱恩·瓦茨

22

以下任何一种都会起作用。我建议使用第一个,因为它可以更准确地表达连接字符串。

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

+1我不知道这些选项。来自Perl的我到处都能看到正则表达式。使用选项拆分是要走的路。
布赖恩·拉斯穆森

1
+1我们使用LINQ如此之多,以至于我们往往会忘记确实存在其他优雅的选择。
Stan R.



5

您可以使用单行解决方案,如下所示:

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


1

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

\s*,\s*

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

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

正则表达式通常会影响性能,但是您给出的示例表明,您打算在代码中为短数组执行一次此操作。


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()时处理数据非常有用。


我们来栈溢出。代码上的一个小问题:如果您使用这样的Linq,最好使用File.ReadLinesReadAllLines将整个文件“吸收”到内存中的数组中,这显然对于大文件是有问题的。 ReadLines一次只读取一行,如果您不需要保留内容的初始版本,那么这很好。
RoadieRich

谢谢!我可以看到使用ReadAllLines的示例将分解为非常大的文件,暂时同时在内存中同时包含原始数据和修剪的版本。File.ReadLines()的文档页面上也有一个适合本讨论的示例。
罗恩·桑德森

0

使用String.Trim一个foreach循环,或者如果您使用的是.NET 3.5+一个LINQ声明。


0

.NET 5随之而来,它是此问题的现代解决方案:

string[] emails = email.Split(',', StringSplitOptions.TrimEntries);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.