閉じる

【C#】Regex.IsMatchの使い方!正規表現で一致を確認する方法を解説

C#でアプリケーションを開発していると、ユーザーが入力した文字列が特定の形式(メールアドレスや郵便番号など)に従っているかを確認したい場面が多々あります。

そのような時に最も便利で強力な手段となるのが、「正規表現(Regular Expression)」を用いたパターンマッチングです。

.NETの「System.Text.RegularExpressions」名前空間に用意されている Regex.IsMatch メソッドを使えば、複雑な文字列判定もわずか一行のコードで実装することが可能です。

本記事では、C#における Regex.IsMatch の基本的な使い方から、パフォーマンスを意識した最新の書き方、実務で使える具体的なサンプルコードまで、プロの視点で徹底的に解説します。

Regex.IsMatchとは?

Regex.IsMatch は、指定した文字列が正規表現で定義されたパターンに 一致するかどうかを「真偽値(bool型)」で返すメソッドです。

Regex クラスには、一致した箇所を抽出する Match や、置換を行う Replace などのメソッドがありますが、IsMatch は「一致するかしないか」というチェックに特化しています。

そのため、入力フォームのバリデーション(妥当性確認)や、条件分岐の判定式として非常によく利用されます。

Regex.IsMatchの基本的な使い方

まずは、最もシンプルな「静的メソッド」としての使い方を見ていきましょう。

この方法では、Regex クラスをインスタンス化せずに直接呼び出すことができます。

静的メソッドによる判定

以下のコードは、対象の文字列に「数字が含まれているか」を判定する例です。

C#
using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string input = "Code123";
        string pattern = @"\d+"; // 1文字以上の数字に一致するパターン

        // Regex.IsMatch(対象文字列, パターン)
        bool result = Regex.IsMatch(input, pattern);

        if (result)
        {
            Console.WriteLine("数字が含まれています。");
        }
        else
        {
            Console.WriteLine("数字は含まれていません。");
        }
    }
}

この例では、\d+ という正規表現パターンを使用しています。

\d は数字を意味し、+ は1回以上の繰り返しを意味します。

注意点として、正規表現パターンを指定する際は、文字列の前に @ を付けた「逐次リテラル文字列」を使用することを推奨します。

これにより、バックスラッシュ(\)をエスケープ(\)せずにそのまま記述できるため、可読性が向上します。

インスタンスメソッドによる判定

同じ判定を何度も繰り返す場合、正規表現エンジンを事前にコンパイルして再利用する「インスタンスメソッド」形式が有効です。

C#
string input = "SampleData";
Regex regex = new Regex(@"^[A-Za-z]+$"); // 英字のみに一致するパターン

if (regex.IsMatch(input))
{
    // 一致した場合の処理
}

後述しますが、大量のデータをループ内で処理する場合は、静的メソッドよりもインスタンス化、あるいは最新の .NET で推奨される Source Generator を使用する方がパフォーマンス面で有利になります。

実践的な活用シーンとサンプルコード

実務でよく使われる具体的なパターンをいくつか紹介します。

これらはそのままコピーして利用できるほど汎用性が高いものです。

1. 郵便番号の形式チェック

日本の郵便番号(3桁-4桁)の形式をチェックします。

C#
string zipCode = "123-4567";
// 行頭(^) + 数字3桁(\d{3}) + ハイフン(-) + 数字4桁(\d{4}) + 行末($)
string pattern = @"^\d{3}-\d{4}$";

if (Regex.IsMatch(zipCode, pattern))
{
    Console.WriteLine("有効な郵便番号です。");
}

2. 半角英数字のみか確認

ユーザーIDなどの登録で、特定の文字種以外を許可しないケースです。

C#
string userId = "user_name_01";
// 英数字およびアンダースコア(_)のみを許可
string pattern = @"^[a-zA-Z0-9_]+$";

if (Regex.IsMatch(userId, pattern))
{
    Console.WriteLine("IDとして使用可能です。");
}

3. 指定したキーワードが含まれるか(大文字・小文字を区別しない)

特定の単語が含まれているかを確認したい場合、オプションを指定することで柔軟な判定が可能です。

C#
string text = "Hello C# World!";
string keyword = "c#";

// RegexOptions.IgnoreCase を指定することで大文字小文字を区別せずに判定
bool contains = Regex.IsMatch(text, keyword, RegexOptions.IgnoreCase);

RegexOptions:動作をカスタマイズする

Regex.IsMatch の第3引数には、判定の挙動を制御する RegexOptions を指定できます。

オプション内容
IgnoreCase大文字と小文字を区別せずにマッチングを行います。
Multiline^$ が、文字列全体の先頭/末尾だけでなく、各行の先頭/末尾にも一致するようにします。
Singlelineドット(.)が改行記号(\n)を含むすべての文字に一致するように変更します。
Compiled正規表現をMSILコードにコンパイルして実行速度を上げます(起動コストは増大します)。

複数のオプションを適用したい場合は、論理和(|)で結合します。

例:RegexOptions.IgnoreCase | RegexOptions.Multiline

パフォーマンスを最大化する「Source Generator」

最新の .NET(.NET 7以降)では、「Regex Source Generator」という機能が導入されました。

これは、ビルド時に正規表現の解析コードを自動生成する仕組みで、従来の実行時コンパイルよりも圧倒的に高速でメモリ効率が良いのが特徴です。

Source Generatorの書き方

クラスを partial(部分クラス)として定義し、[GeneratedRegex] 属性を付与したメソッドを作成します。

C#
using System.Text.RegularExpressions;

public partial class Validator
{
    // ビルド時にこのパターンの判定コードが自動生成される
    [GeneratedRegex(@"^\d+$")]
    private static partial Regex MyNumberRegex();

    public void Check(string input)
    {
        if (MyNumberRegex().IsMatch(input))
        {
            // 数字のみの場合の処理
        }
    }
}

これからのC#開発において、固定の正規表現パターンを使用する場合は、この Source Generator を利用するのがベストプラクティスです。

実行時のオーバーヘッドがほぼゼロになり、アプリケーションの応答性が向上します。

Regex.IsMatch使用時の注意点とセキュリティ

正規表現は非常に便利ですが、使い方を誤るとシステムの停止やセキュリティリスクを招く恐れがあります。

タイムアウトの設定(ReDoS対策)

悪意のある複雑な文字列を入力することで、正規表現エンジンに膨大な計算をさせ、CPUを占有させる攻撃を「ReDoS(Regular Expression Denial of Service)」と呼びます。

これを防ぐためには、必ず タイムアウト値 を設定するようにしましょう。

C#
try
{
    // 判定に1秒以上かかる場合は例外をスローする
    bool isMatch = Regex.IsMatch(input, pattern, RegexOptions.None, TimeSpan.FromSeconds(1));
}
catch (RegexMatchTimeoutException)
{
    // タイムアウト発生時のエラー処理
}

特に、外部からの入力をそのまま正規表現にかけたり、複雑な入れ子構造のパターン(例:(a+)+$ など)を使用したりする場合は、タイムアウトの設定が必須です。

全体一致か部分一致か

Regex.IsMatch を使う初心者が最も陥りやすいミスが、「全体が一致しているか」を確認したいのに「部分的に含まれているか」を判定してしまうケースです。

  • パターン:\d{3} (3桁の数字が含まれるか)
  • 入力: “ABC123XYZ”
  • 結果: True

もし「文字列全体が3桁の数字のみであること」を条件にしたい場合は、必ず ^(行頭)と $(行末)でパターンを囲んでください。

  • パターン:^\d{3}$
  • 入力: “ABC123XYZ”
  • 結果: False

まとめ

C#の Regex.IsMatch メソッドは、文字列のパターン確認において最も基本的かつ重要なツールです。

  • 簡易的なチェックには、静的な Regex.IsMatch(input, pattern) を使用する。
  • 大文字小文字の無視などは RegexOptions で制御する。
  • 高パフォーマンスが求められる環境では、最新の [GeneratedRegex] (Source Generator)を活用する。
  • セキュリティ対策として、必ずタイムアウトを設定し、ReDoS攻撃を未然に防ぐ。

これらを意識することで、堅牢で高速なアプリケーションを開発できるようになります。

正規表現は一見難解ですが、マスターすればテキスト処理の効率が劇的に向上します。

まずは身近なバリデーションの実装から、Regex.IsMatch を積極的に取り入れてみてください。

より詳細な正規表現のメタ文字(記号の意味)については、Microsoft公式ドキュメントの正規表現言語 – クイック リファレンスも併せて参照することをお勧めします。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!