C#正規表現完全ガイド!Regexクラスのメソッド・プロパティを初心者向けに解説
生徒
「文字列の中から特定の文字やパターンを探し出す方法ってありますか?例えば、メールアドレスの形式になっているか確認したいんです。」
先生
「C#では、正規表現という仕組みを使い、Regexクラスという便利な道具を使って、特定のパターンを検索したり、置き換えたりすることができます。」
生徒
「正規表現って難しそうですね。Regexクラスにはどんな機能があるんですか?」
先生
「最初は難しく感じるかもしれませんが、一度覚えると非常に強力な武器になります。よく使うメソッドやプロパティを順番に見ていきましょう!」
1. 正規表現とRegexクラスとは?
プログラミングの世界には、正規表現(せいきひょうげん)という、文字列のパターンを表現する特別な書き方があります。英語ではRegular Expression(レギュラー・エクスプレッション)と呼び、略してRegex(レジェックス)と呼ばれます。
例えば、「電話番号のような数字の並びを探したい」「メールアドレスとして正しい形式かチェックしたい」「文章の中にある特定の言葉をすべて別の言葉に置き換えたい」といった場面で大活躍します。パソコンでいうところの「検索機能」を超強力にしたものだと考えてください。
C#というプログラミング言語では、この正規表現を簡単に扱うためにRegexクラスというものが用意されています。クラスとは、特定の機能を持った「道具箱」のようなものです。この道具箱の中には、検索をするためのボタン(メソッド)や、設定を確認するための情報(プロパティ)がたくさん詰まっています。
プログラミング未経験の方は、まず「文字列を自由自在に操るための魔法の呪文」が正規表現で、その呪文を唱えるための杖がRegexクラスだとイメージしてみましょう。
2. 文字列の中にパターンがあるか確認するIsMatchメソッド
最初にご紹介するのは、一番よく使われるIsMatch(イズマッチ)メソッドです。これは、対象となる文字列の中に、指定したパターンが含まれているかどうかを調べるメソッドです。
結果は、含まれていれば「真(true)」、含まれていなければ「偽(false)」という二択の答えで返ってきます。例えば、入力されたデータに禁止されている文字が入っていないか、あるいは必須のキーワードが入っているかを確認する際に非常に便利です。
下記のコード例では、文章の中に「プログラミング」という単語が含まれているかを判定しています。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string text = "私は今日からプログラミングを学び始めます。";
string pattern = "プログラミング";
// Regex.IsMatchを使って、パターンが含まれているか確認
if (Regex.IsMatch(text, pattern))
{
Console.WriteLine("指定した単語が見つかりました!");
}
else
{
Console.WriteLine("指定した単語は見つかりませんでした。");
}
}
}
実行結果は以下のようになります。
指定した単語が見つかりました!
3. 見つかった最初の情報を取得するMatchメソッド
IsMatchは「あるかないか」を調べるだけでしたが、Match(マッチ)メソッドは、最初に見つかった箇所そのものの情報を詳しく取得するためのメソッドです。
このメソッドを使うと、Matchクラスという別の道具が返ってきます。この中には、「どこで見つかったのか(位置)」「どんな文字が見つかったのか(値)」といった詳細なデータが入っています。
例えば、たくさんの文字が並んでいる中から、最初に出てくる数字だけを抜き出したいときに使います。初心者の方は「まずは一箇所だけ見つけ出すもの」と覚えておけば間違いありません。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "私のラッキーナンバーは777と888です。";
// \d+ は「1文字以上の数字」という意味の正規表現です
string pattern = @"\d+";
Match match = Regex.Match(input, pattern);
if (match.Success)
{
Console.WriteLine("見つかった値: " + match.Value);
Console.WriteLine("見つかった位置: " + match.Index);
}
}
}
実行結果は以下のようになります。最初の「777」だけが取り出されているのがわかります。
見つかった値: 777
見つかった位置: 10
4. 当てはまるものをすべて取り出すMatchesメソッド
文章の中に、検索したいパターンが複数ある場合はどうすればよいでしょうか。そんな時に使うのがMatches(マッチズ)メソッドです。Matchメソッドが「最初のひとつ」だったのに対し、Matchesは「見つかったものすべて」をリストアップしてくれます。
このメソッドの結果は、MatchCollection(マッチコレクション)という形式で返ってきます。これは「見つかった情報の詰め合わせセット」のようなものです。
たとえば、大量の文章の中から、すべての数字を抜き出したい、あるいは特定のタグがついた言葉をすべてリスト化したい、といった場面で利用されます。リストの中身をひとつずつ取り出すには、foreachという繰り返し命令を一緒に使うのが一般的です。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "リンゴは100円、バナナは150円、イチゴは300円です。";
string pattern = @"\d+"; // 数字の部分を探す
// すべてのマッチ箇所を取得
MatchCollection matches = Regex.Matches(input, pattern);
Console.WriteLine("数字はいくつ見つかった?: " + matches.Count);
foreach (Match m in matches)
{
Console.WriteLine("見つかった数字: " + m.Value);
}
}
}
実行結果は以下の通りです。
数字はいくつ見つかった?: 3
見つかった数字: 100
見つかった数字: 150
見つかった数字: 300
5. 文字列を置き換えるReplaceメソッド
特定のパターンに一致した部分を、別の文字に書き換えたい場合にはReplace(リプレイス)メソッドを使います。これはWordやExcelにある「置換」機能と同じ役割を果たします。
例えば、文章の中にある伏せ字にしたい単語を記号に変えたり、日付の形式(2024/01/01を2024年01月01日にするなど)を一括で変更したりする際に非常に強力です。
正規表現を使うことで、単純な文字列の置き換えだけでなく、「数字の部分だけを伏せ字にする」といった柔軟な指定が可能になります。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "おれの電話番号は 090-1234-5678 だよ。";
// 数字をすべて「*」に置き換えるパターン
string pattern = @"\d";
string result = Regex.Replace(input, pattern, "*");
Console.WriteLine("変換前: " + input);
Console.WriteLine("変換後: " + result);
}
}
実行結果は以下のようになります。
変換前: おれの電話番号は 090-1234-5678 だよ。
変換後: おれの電話番号は ***-****-**** だよ。
6. 文字列を分割するSplitメソッド
Split(スプリット)メソッドは、指定したパターンを「区切り文字」として使い、文字列をバラバラに分解して配列(データのリスト)にするメソッドです。
通常、文字列を分割するときはコンマやスペースといった単純な文字を指定しますが、正規表現のSplitを使えば、「カンマか、あるいはセミコロンか、あるいは空白がある場所で切り分ける」といった複雑なルールで分割ができます。
データ分析などで、形式がバラバラな名簿や数値を整理する際に重宝されます。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
// カンマ、点、セミコロンが混ざった文字列
string input = "赤色,青色.黄色;緑色";
// カンマか点かセミコロンのどれかで分割する
string pattern = @"[,.;]";
string[] results = Regex.Split(input, pattern);
foreach (string color in results)
{
Console.WriteLine("色: " + color);
}
}
}
実行結果は以下の通りです。記号がバラバラでも綺麗に切り分けられています。
色: 赤色
色: 青色
色: 黄色
色: 緑色
7. Regexクラスの便利なオプション設定
Regexクラスを使うとき、より細かく動作を制御するためのRegexOptions(レジェックス・オプション)という設定項目があります。これはメソッドの引数として渡すことで、検索のルールをカスタマイズできるものです。
代表的なものに以下の設定があります。
- IgnoreCase(イグノア・ケース): アルファベットの大文字と小文字を区別せずに検索します。これを使えば「A」も「a」も同じものとして扱われます。
- Multiline(マルチライン): 文字列が複数行にわたる場合、各行の行頭や行末を正しく認識するようにします。
- Singleline(シングルライン): 文字列全体を一行として扱い、改行コードも「あらゆる文字」を表すドット(.)に含めるようにします。
これらは、正規表現の挙動を調整するためのスイッチのような役割を果たします。
8. インスタンス化して使う方法
これまでの例では Regex.IsMatch(...) のように、直接クラスの名前を呼んで使ってきました。これを静的メソッドと呼びます。しかし、同じパターンを何度も繰り返し使う場合は、あらかじめ「正規表現オブジェクト」を作っておく(インスタンス化する)方が効率的です。
インスタンス化するには Regex reg = new Regex("パターン"); のように書きます。一度この「専用の機械」を作っておけば、次回からはその機械を使い回すだけで済むため、プログラムの動作が速くなることがあります。
特に大規模なシステムや、何万回も同じ検索を繰り返すループ処理の中では、この「インスタンス化」が推奨されます。
9. Matchクラスのプロパティを使いこなす
MatchメソッドやMatchesメソッドで得られた結果(Matchオブジェクト)には、さらに詳細を知るためのプロパティがあります。
- Success: 検索が成功したかどうかを「true/false」で教えてくれます。
- Value: 実際にマッチした文字列の中身そのものです。
- Index: 文字列の何番目からマッチしたかという開始位置です。
- Length: マッチした文字列の長さです。
- Groups: 正規表現の中でカッコ
()を使ってグループ化した部分だけを取り出すために使います。
これらを組み合わせることで、「見つかった文字をただ表示する」だけでなく、「見つかった場所を特定して、その前後の文字を加工する」といった高度な処理が可能になります。
10. 初心者が注意すべき正規表現の基本
最後に、正規表現を扱う上での重要なポイントをいくつか解説します。
まず、C#のコード内で正規表現を書くときは、文字列の前に @ 記号(逐次形式文字列リテラル)を付けるのが一般的です。これは、正規表現でよく使われるバックスラッシュ(\)が、C#本来の特殊文字(エスケープシーケンス)と衝突しないようにするためです。
また、正規表現は非常に強力ですが、複雑なパターンを書きすぎると、後で自分でも読み返せなくなる「呪文」になってしまいがちです。まずは単純な文字の一致から始め、少しずつ「\d(数字)」や「+(1回以上の繰り返し)」といった特殊な記号を覚えていくのが、挫折しないコツです。
正規表現はC#だけでなく、他のプログラミング言語でも共通して使える知識です。一度基礎を身につければ、あなたのプログラミングスキルは飛躍的に向上するはずです。