85

I have a string that comes in like:

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

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] = "[email protected]"
emails[1] = " [email protected]"
emails[2] = " [email protected]"

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] = "[email protected]"
emails[1] = "[email protected]"
emails[2] = "[email protected]"
1
  • 2
    If the space will always be there, you could add it to the split... ie: email.Split(', '); Commented Aug 31, 2009 at 4:02

12 Answers 12

265
emails.Split(',').Select(email => email.Trim()).ToArray()
Sign up to request clarification or add additional context in comments.

8 Comments

@Moismyname: I'm not sure what constraint would lead you down that path, but there are other answers that address your question.
First: very nice solution ! Regarding the question of the OP shouldn't it be email.Split(...)... instead of emails.Split(..)... ? I think emails is already the split array.
This is better than the accepted answer, as the question was to TRIM each string, not necessarily replace spaces with blanks.
@IrfanUllah: Chain a .Where(email => email != null)
@MinhTran It is indeed a function call - Select is a family of extension methods that make up LINQ in the System.Linq namespace.
|
42

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

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

5 Comments

Works ok for this specific example, but doesn't maintain spaces for the resultant elements like; "foo bar, another element, blah_blah". Bryan Watts has the best answer IMO.
Hi @revgum! That's true, but I have sticked to comply @leora's requirements. The example you´re describing, IMO, is outside the context of this question. Thanks anyway for your feedback.
-1 I agree that this is not a good thing to do. Buyer beware.
also downvoted. i agree that the answer does the trick, but Bryans answer is more useful in general
This isn't right. It will not trim, but remove spaces from strings in array, which is totally different from trim (removing trailing and leading spaces)
23

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

3 Comments

+1 I didn't know about the options. Coming from Perl I see regexs everywhere. With the options Split is the way to go.
+1 we use LINQ so much that we tend to forget that other elegant options do exist.
In this specific case, email addresses can't have spaces, so I would use the second option.
11

You can use Trim():

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

1 Comment

This answer is correct but is overkill, this answer has the best approach: stackoverflow.com/questions/1355704/…
8

Use Regex.Split to avoid trimming

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

Comments

7

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

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

1 Comment

This should be considered as the best option, as it's more perf than any other answer here
5

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

Comments

4

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

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

Comments

2

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.

Comments

1

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

2 Comments

Wecome to Stack Overflow. One small point on your code: If you're using Linq like that, you might be better using File.ReadLines. ReadAllLines "slurps" the entire file into an array in memory, which can obviously be problematic with big files. ReadLines only reads one line at a time, which is great if you don't need to keep the initial version of the contents.
Thanks! I can see that the example using ReadAllLines will break down for very large files, containing both the raw data and the trimmed versions in memory at the same time, for a moment. The documentation page for File.ReadLines() also has an example that fits in with this discussion.
0

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

Comments

0

In .NET 5, they added StringSplitOptions.TrimEntries.

You can use it like

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

Which will give you

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.