[C#] 正規表現を使ったデータバリデーション

スポンサーリンク

はじめに

正規表現(Regex) は、文字列操作の中でも特にデータバリデーションで威力を発揮します。C# では、System.Text.RegularExpressions 名前空間を活用して、簡単かつ効率的に入力データの整合性をチェックできます。本記事では、実践的な例を通じて正規表現を使ったデータバリデーションの方法を解説します。

正規表現を使ったデータバリデーションの基本

データバリデーションとは、入力データが期待される形式や条件を満たしているかを確認するプロセスです。C# では、正規表現を使用してデータの検証を簡潔に記述できます。

以下は基本的な使い方の例です:

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string pattern = @"^\d{3}-\d{3}-\d{4}$"; // 電話番号の例
        string input = "123-456-7890";

        if (Regex.IsMatch(input, pattern))
        {
            Console.WriteLine("入力は有効です。");
        }
        else
        {
            Console.WriteLine("入力が無効です。");
        }
    }
}

 

主な正規表現パターンと使用例

メールアドレスの検証

このパターンは、ユーザー名部分、@ 記号、ドメイン部分を検証します。

string emailPattern = @"^[\w\.-]+@[\w\.-]+\.\w+$";
string email = "example@example.com";

if (Regex.IsMatch(email, emailPattern))
{
    Console.WriteLine("有効なメールアドレスです。");
}
else
{
    Console.WriteLine("無効なメールアドレスです。");
}

 

電話番号の検証

ハイフンで区切られた3桁-3桁-4桁の形式を持つ電話番号をチェックします。

string phonePattern = @"^\d{3}-\d{3}-\d{4}$";
string phone = "123-456-7890";

if (Regex.IsMatch(phone, phonePattern))
{
    Console.WriteLine("有効な電話番号です。");
}
else
{
    Console.WriteLine("無効な電話番号です。");
}

 

パスワードの強度チェック

このパターンは、以下の条件を満たすパスワードを検証します:

  • 最低1つの大文字
  • 最低1つの数字
  • 最低1つの特殊文字
  • 8文字以上
string passwordPattern = @"^(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$";
string password = "StrongPass1!";

if (Regex.IsMatch(password, passwordPattern))
{
    Console.WriteLine("強力なパスワードです。");
}
else
{
    Console.WriteLine("パスワードが弱すぎます。");
}

正規表現の構造と意味

^(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$

 

^ と $

  • ^: パスワードの先頭を示します。
  • $: パスワードの末尾を示します。
  • この2つを組み合わせることで、パスワード全体が指定されたパターンに従う必要があることを示します。

 

 

条件を指定する部分: (?=...)

  • (?=...) は「ポジティブ・ルックアヘッド」と呼ばれるもので、「…」の条件を満たしているかどうかを確認します。
  • 各条件を1つずつ見ていきます:
(?=.*[A-Z])
  • [A-Z]: 英大文字1文字(AからZ)にマッチします。
  • .*: 任意の文字(0文字以上)を表します。
  • この条件は、「どこかに英大文字が最低1文字含まれている」ことを確認します。
(?=.*\d)
  • \d: 数字1文字(0〜9)にマッチします。
  • .*: 任意の文字(0文字以上)を表します。
  • この条件は、「どこかに数字が最低1文字含まれている」ことを確認します。
(?=.*[@$!%*?&])
  • [@$!%*?&]: 特定の特殊文字(@, $, !, %, *, ?, & のいずれか1つ)にマッチします。
  • .*: 任意の文字(0文字以上)を表します。
  • この条件は、「どこかに指定された特殊文字が最低1文字含まれている」ことを確認します。

 

 

パスワード全体の条件: [A-Za-z\d@$!%*?&]{8,}

  • [A-Za-z\d@$!%*?&]:
    • 英大文字(A〜Z)
    • 英小文字(a〜z)
    • 数字(0〜9)
    • 特殊文字(@, $, !, %, *, ?, &
    • これらのいずれか1文字にマッチします。
  • {8,}:
    • 少なくとも8文字以上であることを指定します。

 

全体の流れ

この正規表現がチェックしていることを簡単に説明すると:

  1. パスワード全体が、以下の条件をすべて満たしている必要があります:
    • 英大文字が最低1文字含まれている。
    • 数字が最低1文字含まれている。
    • 特定の特殊文字が最低1文字含まれている。
    • 8文字以上である。
  2. 上記以外の文字(例: 空白文字や非指定の特殊文字)は許可されません。

サンプル結果

入力パスワード 結果 理由
Password1! 強力なパスワードです 英大文字、数字、特殊文字が含まれており、8文字以上です。
password1! パスワードが弱すぎます 英大文字が含まれていません。
PASSWORD1! パスワードが弱すぎます 英小文字が含まれていません。
Password! パスワードが弱すぎます 数字が含まれていません。
Pass1! パスワードが弱すぎます 長さが8文字未満です。

 

郵便番号の検証(日本)

日本の郵便番号(3桁-4桁形式)を検証します。

string postalCodePattern = @"^\d{3}-\d{4}$";
string postalCode = "123-4567";

if (Regex.IsMatch(postalCode, postalCodePattern))
{
    Console.WriteLine("有効な郵便番号です。");
}
else
{
    Console.WriteLine("無効な郵便番号です。");
}

 

データバリデーションのベストプラクティス

入力値のサニタイズ

正規表現で形式をチェックするだけでなく、不正な入力やSQLインジェクションを防ぐため、入力値のサニタイズも必須です。

例外処理を実装

予期しないエラーを防ぐため、バリデーション処理には例外処理を追加しましょう。

ユーザーフィードバック

無効な入力の場合、ユーザーに明確なエラーメッセージを表示することで、入力ミスを修正しやすくします。

 

まとめ

正規表現は、C# におけるデータバリデーションを簡潔にする強力なツールです。本記事で紹介した例を参考にすることで、アプリケーションで必要なデータ形式を効率的にチェックできます。

Please follow and like us:

コメント

タイトルとURLをコピーしました