trim all strings in an array

I have a string that comes in like:

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

I want to split it into an array of strings

If I do this:

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

I get spaces in front of each email address (after the first one):

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

What is the best way to get this (either a better way to parse or a way to trim all strings in an array)?

emails[0] = "a@a.com"
emails[1] = "b@b.com"
emails[2] = "c@c.com"
82663 次浏览

You can use Trim():

string email = "a@a.com, b@b.com, c@c.com";
string[] emails = email.Split(',');
emails = (from e in emails
select e.Trim()).ToArray();

Use String.Trim in a foreach loop, or if you are using .NET 3.5+ a LINQ statement.

Alternatively, you can split using a regular expression of the form:

\s*,\s*

i.e.

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

It will consume the surrounding spaces directly.

Regular expressions are usually a performance hit, but the example you gave indicates that this is something you plan to do once in your code for a short array.

You could also replace all occurrences of spaces, and so avoid the foreach loop:

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

Use Regex.Split to avoid trimming

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

Either one of the following would work. I'd recommend the first since it more accurately expresses the joining string.

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

You can use a one line solution like this:

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

The answer from Bryan Watts is elegant and simple. He implicitly refers to the array of strings created by the Split().

Also note its extensibility if you are reading a file, and want to massage the data while building an array.

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();

Of course, you can use the Linq => notation if you prefer.

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

Although my answer should have been posted as a comment, I don't have enough reputation points to comment yet. But I found this discussion invaluable in figuring out how to massage data while using ReadAllLines().

If you just need to manipulate the entries, without returning the array:

string[] emails = text.Split(',');
Array.ForEach(emails, e => e.Trim());

.NET 5 has arrived and with it, a modern solution to this problem:

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

In .NET 5, they added StringSplitOptions.TrimEntries.

You can use it like

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

Which will give you

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