例えば「①_二/Ⅲ」という文字列があったとします。
この文字列から「①」と「二」と「Ⅲ」をそれぞれ分割して抽出したい場合があるかと思います。
パターンにマッチした部分全体の抽出方法についての解説記事はたくさんあったのですが、それぞれの部分のみの抽出方法についてはあまり解説がなかったので、備忘録を兼ねてサンプルコードを載せてみます。
端的にはRegexの結果をMatchオブジェクトに入れて、Matchオブジェクト内のGroupsプロパティを順番に見ていくことで、抽出したい部分を取得することが出来ます。この際、Regexのパターンで抽出したい部分を括弧で括るのがミソです(テキストエディタの置換とかでおなじみですね)。
具体的なコードはこんな感じです。
//これが書いてある前提 using System.Text.RegularExpressions; /* 中略 */ //対象文字列 string sStr = "①_二/Ⅲ"; //パターン Regex re = new Regex(@"(.+)_(.+)/(.+)"); //(最初の)パターンマッチの結果 //マッチした部分全てを対象としたい場合はMatchCollectionでforeachする Match mt = re.Match(sStr); //抽出 if (mt.Success) //マッチしなかった場合はfalseとなる { for (int i = 0; i < mt.Groups.Count; i++) { Console.WriteLine("{0}:{1}", i, mt.Groups[i].Value); } }
上記のサンプルでの出力結果はこんな感じです。
0:①_二/Ⅲ
1:①
2:二
3:Ⅲ
1:①
2:二
3:Ⅲ
「Match.Groups」の先頭(0番目)にはマッチした文字列全体が、1番目以降にそれぞれの部分が入っているようです。
また、「①」を何らかの変数で取り出したい場合は
string s1 = mt.Groups[1].Value;
とすればいい、ということになります。