web-dev-qa-db-ja.com

配列内のすべての文字列をトリムします

次のような文字列があります:

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

文字列の配列に分割したい

これを行う場合:

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

各メールアドレスの前にスペースがあります(最初のメールアドレスの後に):

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

これを取得する最良の方法は何ですか(解析するより良い方法または配列内のすべての文字列をトリムする方法のどちらか)?

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

出現するすべてのスペースを置き換えることもできるため、foreachループを回避できます。

string email = "[email protected], [email protected], [email protected]";    
string[] emails = email.Replace(" ", "").Split(',');
36
nick2083
emails.Split(',').Select(email => email.Trim()).ToArray()
213
Bryan Watts

次のいずれかが機能します。結合文字列をより正確に表現するため、最初のものをお勧めします。

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

Trim()を使用できます:

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

つかいます Regex.Splitトリミングを回避するため

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

次のような1行のソリューションを使用できます。

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

または、次の形式の正規表現を使用して分割できます。

\s*,\s*

つまり.

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

周囲のスペースを直接消費します。

通常、正規表現はパフォーマンスに影響しますが、この例では、短い配列のコードでこれを1回行う予定があることを示しています。

1
Jan Zich

ブライアン・ワッツの答えはエレガントでシンプルです。彼は暗黙的に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()を使用しながらデータを処理する方法を理解する上で、この議論は非常に貴重であることがわかりました。

1
RonSanderson

配列を返さずにエントリを操作するだけの場合:

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

つかいます String.Trimforeachループ内、または.NET 3.5+を使用している場合はLINQステートメント。

0
jscharf