String.Split メソッドは「カンマ」や「空白」といった固定の文字でしか分割できませんが、Regex.Split を使用すると、「数字が現れた場所で区切る」「カンマまたはセミコロンまたは空白で区切る」といった柔軟なルールで文字列を分割配列に変換できます。
複数の区切り文字に対応する実装
以下のサンプルコードでは、ユーザーが自由に入力した「タグ(キーワード)」の文字列を、配列に分解する処理を実装しています。 ユーザーは区切り文字として「カンマ」「セミコロン」「縦線(パイプ)」さらに「空白」を混在させて使っていますが、正規表現を使うことでこれらをまとめて処理します。
サンプルコード
using System;
using System.Text.RegularExpressions;
using System.Linq; // 空文字の除去に使用
public class Program
{
public static void Main()
{
// ユーザーが入力したタグ文字列
// 区切り文字がバラバラ(カンマ、セミコロン、パイプ、空白)で、余計なスペースも含まれている
string inputTags = "C# , Java ; Python | Ruby GoLang";
Console.WriteLine($"元の文字列: \"{inputTags}\"\n");
// ---------------------------------------------------------
// 正規表現パターンで分割
// ---------------------------------------------------------
// パターンの意味:
// \s* : 空白が0回以上(前方の空白)
// [,;|] : カンマ、セミコロン、パイプ のいずれか1文字
// \s* : 空白が0回以上(後方の空白)
// | : または
// \s+ : 連続する空白(区切り文字がない場合のスペース区切り用)
string pattern = @"\s*[,;|]\s*|\s+";
string[] result = Regex.Split(inputTags, pattern);
Console.WriteLine("--- 分割結果 ---");
// 分割結果に空文字が含まれる場合があるため、Whereで除外して表示
foreach (var tag in result.Where(s => !string.IsNullOrEmpty(s)))
{
Console.WriteLine($"タグ: {tag}");
}
}
}
実行結果
元の文字列: "C# , Java ; Python | Ruby GoLang"
--- 分割結果 ---
タグ: C#
タグ: Java
タグ: Python
タグ: Ruby
タグ: GoLang
解説と技術的なポイント
1. String.Split との違い
Regex.Split の最大の利点は、「パターン」で区切れることです。 単純な String.Split(',') では "C# , Java" のようなデータのカンマ前後の空白を除去できませんが、正規表現 \s*,\s* を使えば、「カンマとその周囲の空白」を丸ごと区切り文字とみなして消し去ることができるため、トリミング処理が不要になります。
2. 区切り文字自体を残したい場合 (カッコの利用)
通常、Regex.Split でマッチした部分(区切り文字)は結果から削除されますが、正規表現パターンを () で囲む(キャプチャグループにする)と、区切り文字そのものも分割結果の配列に含まれるようになります。
例:数式を数値と演算子に分解する
string formula = "100+200-50";
// ([+\-]) と括弧で囲むと、演算子も配列に残る
string[] tokens = Regex.Split(formula, @"([+\-])");
// 結果: "100", "+", "200", "-", "50"
3. 空文字の除去
分割パターンの書き方によっては、文字列の先頭や末尾、または連続する区切り文字の間に「空文字列」が発生することがあります。 そのため、実用的なデータ処理では、LINQの .Where(s => !string.IsNullOrEmpty(s)) を併用して、有効なデータのみを取り出すのが定石です。
