次のような文字列があります:
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]"
出現するすべてのスペースを置き換えることもできるため、foreachループを回避できます。
string email = "[email protected], [email protected], [email protected]";
string[] emails = email.Replace(" ", "").Split(',');
emails.Split(',').Select(email => email.Trim()).ToArray()
次のいずれかが機能します。結合文字列をより正確に表現するため、最初のものをお勧めします。
string[] emails = email.Split(new string[] { ", " }, StringSplitOptions.None);
string[] emails = email.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
Trim()を使用できます:
string email = "[email protected], [email protected], [email protected]";
string[] emails = email.Split(',');
emails = (from e in emails
select e.Trim()).ToArray();
つかいます Regex.Split
トリミングを回避するため
var emails = Regex.Split(email, @",\s*");
次のような1行のソリューションを使用できます。
string[] emails = text.Split(',', StringSplitOptions.RemoveEmptyEntries);
Array.ForEach<string>(emails, x => emails[Array.IndexOf<string>(emails, x)] = x.Trim());
または、次の形式の正規表現を使用して分割できます。
\s*,\s*
つまり.
string[] emails = Regex.Split(email, @"\s*,\s*");
周囲のスペースを直接消費します。
通常、正規表現はパフォーマンスに影響しますが、この例では、短い配列のコードでこれを1回行う予定があることを示しています。
ブライアン・ワッツの答えはエレガントでシンプルです。彼は暗黙的に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()を使用しながらデータを処理する方法を理解する上で、この議論は非常に貴重であることがわかりました。
配列を返さずにエントリを操作するだけの場合:
string[] emails = text.Split(',');
Array.ForEach(emails, e => e.Trim());
つかいます String.Trim
foreach
ループ内、または.NET 3.5+を使用している場合はLINQステートメント。