'trim all strings in an array
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]"
Solution 1:[1]
emails.Split(',').Select(email => email.Trim()).ToArray()
Solution 2:[2]
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);
Solution 3:[3]
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();
Solution 4:[4]
Use Regex.Split to avoid trimming
var emails = Regex.Split(email, @",\s*");
Solution 5:[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());
Solution 6:[6]
If you just need to manipulate the entries, without returning the array:
string[] emails = text.Split(',');
Array.ForEach(emails, e => e.Trim());
Solution 7:[7]
.NET 5 has arrived and with it, a modern solution to this problem:
string[] emails = email.Split(',', StringSplitOptions.TrimEntries);
Solution 8:[8]
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.
Solution 9:[9]
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().
Solution 10:[10]
Use String.Trim in a foreach loop, or if you are using .NET 3.5+ a LINQ statement.
Solution 11:[11]
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]"
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
