【C#】文字列を指定した正規表現パターンで分割する (Regex.Split)

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)) を併用して、有効なデータのみを取り出すのが定石です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次