82

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"
gotqn
  • 42,737
  • 46
  • 157
  • 243
leora
  • 188,729
  • 360
  • 878
  • 1,366
  • 2
    If the space will _always_ be there, you could add it to the split... ie: email.Split(', '); – nilamo Aug 31 '09 at 04:02

12 Answers12

262
emails.Split(',').Select(email => email.Trim()).ToArray()
Bryan Watts
  • 44,911
  • 16
  • 83
  • 88
41

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(',');
Community
  • 1
  • 1
nick2083
  • 1,953
  • 13
  • 16
  • 13
    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. – revgum Jun 11 '12 at 14:33
  • 1
    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. – nick2083 Jun 27 '12 at 00:29
  • 2
    -1 I agree that this is not a good thing to do. Buyer beware. – Scott Adams Jun 19 '13 at 13:04
  • also downvoted. i agree that the answer does the trick, but Bryans answer is more useful in general – Joris Van Regemortel Feb 12 '14 at 10:36
  • 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) – SimpleGuy Nov 13 '20 at 02:24
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);
Sam Harwell
  • 97,721
  • 20
  • 209
  • 280
11

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();
skalb
  • 5,357
  • 3
  • 26
  • 23
  • This answer is correct but is overkill, this answer has the best approach: http://stackoverflow.com/questions/1355704/trim-all-strings-in-an-array/1355732#1355732 – Andrew Hare Aug 31 '09 at 04:07
8

Use Regex.Split to avoid trimming

var emails = Regex.Split(email, @",\s*");
Brian Rasmussen
  • 114,645
  • 34
  • 221
  • 317
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());
mr.martan
  • 215
  • 3
  • 2
5

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

string[] emails = email.Split(',', StringSplitOptions.TrimEntries);
formicini
  • 298
  • 4
  • 16
  • This should be considered as the best option, as it's more perf than any other answer here – cdie Oct 13 '21 at 13:55
4

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

string[] emails = text.Split(',');
Array.ForEach(emails, e => e.Trim());
Teodor Tite
  • 1,855
  • 3
  • 24
  • 31
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.

Jan Zich
  • 14,993
  • 18
  • 61
  • 73
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().

  • Wecome to [SO]. 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. – RoadieRich Mar 17 '16 at 21:02
  • 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. – RonSanderson Mar 21 '16 at 11:04
0

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

jscharf
  • 5,829
  • 3
  • 24
  • 16
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] = "a@a.com"
emails[1] = "b@b.com"
emails[2] = "c@c.com"
Dan
  • 7,286
  • 6
  • 49
  • 114