ユーザーが入力したデータが正しい形式になっているか(例:郵便番号、電話番号、メールアドレスなど)をチェックする際、正規表現(Regular Expressions) は非常に強力なツールです。
C#では System.Text.RegularExpressions 名前空間の Regex.IsMatch メソッドを使用することで、対象の文字列が特定のパターンに一致するかどうかを簡単に true / false で判定できます。
郵便番号の形式チェックの実装
以下のサンプルコードでは、日本の郵便番号形式(3桁の数字 - 4桁の数字)に完全に一致するかどうかを判定しています。
サンプルコード
using System;
using System.Text.RegularExpressions; // 正規表現機能を使用するために必要
public class Program
{
public static void Main()
{
// チェック対象の文字列リスト
string[] inputs = new string[]
{
"100-0001", // 正しい形式
"1234567", // ハイフンがない
"123-45ab", // 数字以外が含まれている
"99-99999", // 桁数が違う
"text 123-4567 end" // 形式は含むが、余計な文字がある
};
// 正規表現パターン:
// ^ : 行の先頭
// \d{3} : 数字が3回
// - : ハイフン
// \d{4} : 数字が4回
// $ : 行の末尾
string pattern = @"^\d{3}-\d{4}$";
Console.WriteLine($"パターン: {pattern}\n");
foreach (var text in inputs)
{
// Regex.IsMatch(対象文字列, パターン)
// 一致すれば true, しなければ false を返す
bool isMatch = Regex.IsMatch(text, pattern);
string result = isMatch ? "〇 一致" : "× 不一致";
Console.WriteLine($"{text,-15} => {result}");
}
}
}
実行結果
パターン: ^\d{3}-\d{4}$
100-0001 => 〇 一致
1234567 => × 不一致
123-45ab => × 不一致
99-99999 => × 不一致
text 123-4567 end => × 不一致
解説と技術的なポイント
1. Regex.IsMatch メソッド
静的メソッド Regex.IsMatch(input, pattern) は、第一引数の文字列が、第二引数の正規表現パターンにマッチするかどうかを判定します。戻り値は bool です。 ※ 繰り返し同じパターンを使う場合は、インスタンスを生成する方法もありますが、単発のチェックならこの静的メソッドが手軽です。
2. 逐語的文字列リテラル (@)
正規表現パターンを文字列として定義する際、先頭に @ を付ける(@"...")ことを推奨します。 通常の文字列ではバックスラッシュ \ がエスケープ文字として扱われるため、正規表現の \d(数字)などを記述する際に \\d と重ねて書く必要がありますが、@ を使えば \d とそのまま記述でき、可読性が向上します。
3. 先頭(^) と 末尾($) の重要性
バリデーション(入力チェック)を行う場合、行頭を表す ^ と、行末を表す $ をパターンに含めることが非常に重要です。
^\d{3}-\d{4}$: 「123-4567」だけの場合に一致します。\d{3}-\d{4}(アンカーなし): 文字列のどこかにそのパターンがあれば一致とみなすため、「住所は100-0001です」のような文章もtrueになってしまいます。
