C#で文字列を分割してみた(Regex.Split編)
C#で文字列を分割してみました。String.Split()メソッドを使うのではなくて、正規表現を使います。
目次
セパレータを正規表現で指定する
例えば、こんなデータを見たことないでしょうか。 4行目にある□は、全角スペースがあることを表しています。 悲しいことに、あるソフトウェアからデータをコピペすると、空行に全角半角問わずスペースが入っていることがあります。そんなとき、「ああ、正規表現が使えれば楽なのに。」と思いますよね。で、Regex.Matchesを駆使して分割したりします。 ところがMSDNのString.Split()メソッドの説明を読んでいたら、セパレータを正規表現で指定したりしてるじゃないですか。というわけで、試してみました。
string[] splitted = Regex.Split(source, pattern);
引数 |
型 |
説明 |
---|---|---|
source |
string |
分割される文字列。 |
pattern |
string |
セパレータとする正規表現文字列。 |
戻り値は、分割された文字列を各要素に持つ文字列配列です。
試してみた
冒頭の文字列を分割してみます。 まず、String.Split()メソッドで分割してみます。
using System;
using System.Text;
using System.IO;
namespace split_trial
{
class Program
{
static void Main(string[] args)
{
string source = File.ReadAllText("data.txt", Encoding.GetEncoding("shift_jis")); // データ読み込み。
string[] separator = new string[] {"\r\n"};
string[] splitted = source.Split(separator, StringSplitOptions.RemoveEmptyEntries);
// ここで実行を停止する。
foreach(var s in splitted)
{
Console.WriteLine(s);
}
}
}
}
分割結果の文字列配列の中身はこのようになります。 大文字スペースの行をデータの1つとして捉えられてしまいました。これだと後処理が必要だったりして、ちょっと面倒ですよね。 では、Regex.Splitで分割してみます。
using System;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
namespace split_trial
{
class Program
{
static void Main(string[] args)
{
string source = File.ReadAllText("data.txt", Encoding.GetEncoding("shift_jis")); // データ読み込み。
string pattern = @"\s*\r\n";
string[] splitted = Regex.Split(source, pattern);
// ここで実行を停止する。
foreach(var s in splitted)
{
Console.WriteLine(s);
}
}
}
}
分割結果の文字列配列の中身はこのようになります。 データ末尾の改行コードもセパレータとして捉えられてしまって、分割後の文字列配列に4つ目の要素が作られてしまいます。中身はString.Emptyのようです。 String.Splitのように空のデータを無視するという分割オプションがありませんので、自分で配列をいじるしかありません。 う~ん、String.Splitで分割するのとどっちが良いのだろう。 試した環境は下記です。
Visual Studio 2015 Express for Windows Desktop (C#)
Windows10
公開日
広告