【C#入門】String.Splitで文字列を分割(複数文字、文字数でも分割)

String.Splitメソッドって使ってますか?

C#ではStringクラスのSplitメソッドを使うと、文字列を指定の区切り文字で分割し配列に格納することができます。

この記事では、Splitメソッドについて

  • String.Splitメソッドとは
  • Splitメソッドの使い方
  • 複数の文字で分割
  • リストに格納する
  • 文字数で分割
  • 正規表現で分割

など基本的な内容から、応用的な内容についても解説していきます。

今回はSplitメソッドについて、使い方をわかりやすく解説します!

目次

String.Splitメソッドとは

String.SplitメソッドとはStringクラスメソッドの一つで、文字列を指定した区切り文字で分割し配列に格納する場合に使います

区切り文字以外にも、文字列でも分割することができます。また、区切り文字や文字列は配列で指定することで複数指定することができます。

オプションとしてStringSplitOptions.RemoveEmptyEntriesを指定すると、分割され格納される配列の要素が空の場合は省略することができます。

Splitメソッドはいろいろな区切り文字、文字列で分割することが多いので、それぞれの場合について詳しくみていきましょう。

Splitメソッドの使い方

ここでは一つの区切り文字、文字列で分割する場合についてみていきます。

スペースで分割

文字列中に含まれるスペースで文字列を分割する方法についてみていきましょう。

using System;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      string str = "侍 エンジニア 塾";
      
      string[] arr =  str.Split(' ');
      Console.WriteLine("{0}", string.Join(", ", arr));
      
      Console.ReadKey();
    }
  }
}

実行結果:

侍, エンジニア, 塾

カンマで分割

次は文字列中に含まれる「,」(カンマ)で文字列を分割する場合です。

using System;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      string str = "侍,エンジニア,塾";
      
      string[] arr =  str.Split(',');
      Console.WriteLine("{0}", string.Join(" ", arr));
      
      Console.ReadKey();
    }
  }
}

実行結果:

侍 エンジニア 塾

改行コードで分割

文字列中に含まれる改行コードで文字列を分割する場合も確認しておきましょう。

C#の場合改行コードは「\n」「\r\n」などで表します。

文字列で分割する場合は、その文字列を格納した配列とStringSplitOptionsを引数に指定する必要があります。

using System;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      string str = "侍\r\nエンジニア\r\n塾";
      string[] del = {"\r\n"};
      
      string[] arr =  str.Split(del, StringSplitOptions.None);
      Console.WriteLine("{0}", string.Join(", ", arr));
      
      Console.ReadKey();
    }
  }
}

実行結果:

侍, エンジニア, 塾

文字列で分割

それでは、文字列で分割する方法についても確認しましょう。

using System;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      string str = "侍エンジニア塾";
      string[] del = {"エンジニア"};
      
      string[] arr =  str.Split(del, StringSplitOptions.None);
      Console.WriteLine("{0}", string.Join(", ", arr));
      
      Console.ReadKey();
    }
  }
}

実行結果:

侍, 塾

複数の文字で分割

Splitメソッドは複数の区切り文字を配列で指定することができます。

それでは「(」、「)」という2つの文字で分割してみましょう。

using System;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      string str = "侍(エンジニア)塾";
      char[] del = {'(', ')'};
      
      string[] arr =  str.Split(del);
      Console.WriteLine("{0}", string.Join(", ", arr));
      
      Console.ReadKey();
    }
  }
}

実行結果:

侍, エンジニア, 塾

リストに格納する

Splitメソッドの戻り値は配列ですので、リストに格納するには型の変換が必要です。

リスト型オブジェクトからAddRangeメソッドを使って、配列を空のリストに追加します。

using System;
using System.Collections.Generic;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      string str = "侍,エンジニア,塾";
      
      string[] arr =  str.Split(',');
      
      var list = new List<string>();
      list.AddRange(arr);
      Console.WriteLine("{0}", string.Join(" ", list));
      
      Console.ReadKey();
    }
  }
}

実行結果:

侍 エンジニア 塾

AddRangeメソッドなどの使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。

文字数で分割

Splitメソッドは文字数を指定して文字列を分割することはできません

文字数を指定して文字列を分割するには、独自のメソッドを作る必要があります。

拡張メソッドを作って、Splitメソッドと同じように呼び出せるようにしてみましょう。

using System;
using System.Collections.Generic;

namespace Sample
{
  // 拡張クラス
  static class Sample
  {
    static void Main()
    {
      string str = "侍エンジニア塾";
      
      string[] arr =  str.MySplit(3);
      Console.WriteLine("{0}", string.Join(", ", arr));
      
      Console.ReadKey();
    }
    
    // 拡張メソッド
    static string[] MySplit(this string str, int count) {
      var list = new List<string>();
      int length = (int)Math.Ceiling((double)str.Length / count);
      
      for(int i = 0; i < length; i++) {
        int start = count * i;
        if(str.Length <= start) {
          break;
        }
        if(str.Length < start + count) {
          list.Add(str.Substring(start));
        } else {
          list.Add(str.Substring(start, count));
        }
      }
      
      return list.ToArray();
    }
  }
}

実行結果:

侍エン, ジニア, 塾

Substringメソッドの使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。

正規表現で分割

StringクラスのSplitメソッドでは正規表現を使って分割することはできません

正規表現とはいくつかの文字列を一つの形式でまとめて表現するための表現方法のことです。主な正規表現については下記のとおりになります。

記号記号の説明例の説明
.任意の1文字。改行文字は除く。.+任意の文字列
*直前の1文字の0回以上の繰り返しと一致hoge*hogeもしくはhogee...と一致
^行の先頭^[0-9]行頭が数字
$行の末尾^.{10}$10文字の行
[ ]カッコ内の任意の1文字と一致。「-」で範囲指定可。[a-z]小文字のアルファベット1文字と一致
[^ ]カッコ内の任意の1文字と不一致。「-」で範囲指定可。[^A-Z]大文字のアルファベット以外
+直前の文字の1個以上の繰り返しと一致hoge+hogee...と一致
?直前の文字の0または1文字と一致hoge?eと一致
{ }カッコ内の数値の繰り返しと一致{n}直前の文字のn個の繰り返しと一致
{,n}直前の文字のn個以下の繰り返しと一致
{m,}直前の文字のm個以上の繰り返しと一致
{m,n}直前の文字のm個以上、n個以下の繰り返しと一致
|直前、直後どちらかのパターンに一致hoge|piyohogeまたはpiyo
( )カッコ内をグループ化。マッチした内容は参照可。

正規表現を使って分割するには、System.Text.RegularExpressions.RegexクラスのSplitメソッドを使う必要があります。

using System;
using System.Text.RegularExpressions;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      string str = "〒100-0005 東京都千代田区丸の内1丁目";
      
      string pattern = "[〒 都道府県市区町村]";
      string[] arr =  Regex.Split(str, pattern);
      
      Console.WriteLine("{0}", string.Join(", ", arr));
      
      Console.ReadKey();
    }
  }
}

実行結果:

, 100-0005, 東京, 千代田, 丸の内1丁目

まとめ

ここでは、Splitメソッドについて説明しました。

Splitメソッドは区切り文字や文字列で文章を分割することができます。使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次