C#正規表現完全ガイド!数値チェックやメールアドレス検証の書き方
生徒
「ユーザーが入力した文字が、ちゃんと数字になっているか、あるいは正しいメールアドレスの形式になっているかを確認する方法はありますか?」
先生
「それには正規表現という便利な道具を使います。C#ではRegexというクラスを使って、特定のパターンに一致するかを簡単に判定できるんですよ。」
生徒
「正規表現って少し難しそうな響きですが、初心者でも使えますか?」
先生
「大丈夫です!型紙に合わせて形をチェックするようなイメージで考えれば、とても分かりやすいですよ。基本から一緒に見ていきましょう。」
1. 正規表現とは何かを分かりやすく解説
プログラミングの世界には、正規表現(せいきひょうげん)という言葉があります。英語では「Regular Expression」と呼ばれ、略して「RegEx」と書かれることも多いです。これは、一言で言うと「文字列のパターンを表現するための共通ルール」のことです。
例えば、あなたがクッキーを焼こうとしている場面を想像してください。星型のクッキーを作りたいとき、手で一つずつ星の形を作るのは大変ですよね?そこで、「星型の抜き型」を使います。この抜き型があれば、どんな生地でも星型に切り抜くことができます。プログラミングにおける正規表現は、まさにこの「抜き型」のような役割を果たします。
「この入力された文字は、数字だけの形をしているかな?」「この文字の並びは、メールアドレスの形として正しいかな?」といったチェックを、あらかじめ決めたルール(抜き型)に照らし合わせて自動で行ってくれるのが正規表現の大きな特徴です。これを使うことで、複雑な文字の判定をたった数行のコードで実現できるようになります。
2. C#で正規表現を使うための準備
C#で正規表現を利用するためには、プログラムの冒頭で「これを使いますよ」という宣言をする必要があります。専門用語では「名前空間の参照」と言いますが、難しく考える必要はありません。お料理を始める前に、必要な道具をキッチンに並べるようなものです。
具体的には、コードの先頭に using System.Text.RegularExpressions; と書き込みます。これによって、C#が標準で用意してくれている「正規表現専用の道具箱」が使えるようになります。この道具箱の中には、文字を比較したり、特定の文字を別の文字に置き換えたりするための便利な機能がたくさん詰まっています。
もしこの一行を忘れてしまうと、コンピューターは「正規表現って何のこと?」と混乱してしまい、エラーが出てしまいます。まずはこのおまじないを忘れずに記述することから始めましょう。
3. 数値だけが含まれているかチェックする方法
まずは、最も基本的な「入力された文字がすべて数字かどうか」を判定する方法を学びましょう。例えば、年齢の入力欄や電話番号の入力欄で、間違えて漢字やアルファベットが入っていないかを確認したいときに役立ちます。
正規表現で数字を表すときは \d という記号を使います。これは「Digit(桁、数字)」の頭文字をとったものです。さらに、「最初から最後まで全部数字だよ」と伝えたいときは、^\d+$ という書き方をします。ここで、記号の意味を簡単に説明します。
^(ハット):ここから始まる、という意味。\d:数字(0から9まで)のどれか。+(プラス):直前のものが1回以上繰り返される、という意味。$(ドル):ここで終わる、という意味。
これらを組み合わせることで、「数字が1文字以上続いて、最初から最後まで数字だけで構成されている」というパターンが完成します。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "12345";
// 数字だけが並んでいるかチェックするパターン
string pattern = @"^\d+$";
if (Regex.IsMatch(input, pattern))
{
Console.WriteLine("すべて数字です。");
}
else
{
Console.WriteLine("数字以外の文字が含まれています。");
}
}
}
実行結果は以下のようになります。
すべて数字です。
4. 郵便番号の形式を検証する
次に、もう少し実用的な例として、日本の郵便番号の形式「3桁の数字、ハイフン、4桁の数字」になっているかをチェックしてみましょう。これは、数字の個数を指定する書き方を使います。
特定の回数だけ繰り返したいときは、波括弧 { } を使います。例えば、\d{3} と書けば「数字がちょうど3回連続する」という意味になります。これを利用して、郵便番号のパターンを作ると ^\d{3}-\d{4}$ となります。真ん中の -(ハイフン)はそのまま文字として扱われます。
このように、固定の記号と数字の個数を組み合わせることで、特定のフォーマットを守っているかどうかを厳密に検査できるようになります。これは住所入力フォームなどで非常に重宝されるテクニックです。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string zipCode = "123-4567";
// 3桁の数字、ハイフン、4桁の数字のパターン
string pattern = @"^\d{3}-\d{4}$";
if (Regex.IsMatch(zipCode, pattern))
{
Console.WriteLine("正しい郵便番号の形式です。");
}
else
{
Console.WriteLine("郵便番号の形式が正しくありません。");
}
}
}
実行結果は以下のようになります。
正しい郵便番号の形式です。
5. メールアドレスが正しいか判定する
正規表現の代表的な使い道といえば、メールアドレスのチェックです。メールアドレスには「@(アットマーク)」が含まれている、最後の方に「.(ドット)」がある、といった複雑なルールがあります。これを一つずつプログラムで書くと大変ですが、正規表現なら短くまとめられます。
初心者の方にとって、メールアドレスの正規表現は少し長く見えるかもしれません。しかし、分解してみれば怖くありません。例えば、[a-zA-Z0-9._%+-]+ という部分は「アルファベットや数字、ドットなどの記号が1回以上続く」という意味です。これらを組み合わせて、全体の構成を確認します。
なお、メールアドレスの厳密な定義は非常に複雑ですが、ここでは一般的に使われる「名前、アットマーク、ドメイン名」という形を確認するパターンを使ってみましょう。実務でも、入力ミスを防止する目的で広く使われています。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string email = "test-user@example.com";
// メールアドレスの基本的な形式をチェックするパターン
string pattern = @"^[^@\s]+@[^@\s]+\.[^@\s]+$";
if (Regex.IsMatch(email, pattern))
{
Console.WriteLine("メールアドレスの形式として適切です。");
}
else
{
Console.WriteLine("メールアドレスの形式ではありません。");
}
}
}
実行結果は以下のようになります。
メールアドレスの形式として適切です。
6. 大文字と小文字を区別せずに検索する
時と場合によっては、アルファベットの大文字と小文字を区別したくないこともあります。例えば、ユーザーが「ABC」と打っても「abc」と打っても、どちらも正解とみなしたい場合です。このようなときは、正規表現のオプション機能を使います。
C#の Regex.IsMatch メソッドには、3つ目の設定項目として RegexOptions.IgnoreCase を追加することができます。これを入れるだけで、大文字か小文字かを気にせずにパターンチェックを行ってくれます。プログラミングでは、こうした「細かい設定」を使い分けることで、よりユーザーに優しいシステムを作ることができます。
例えば、特定の商品コードが「A」で始まるかどうかを調べたいとき、大文字の「A」と小文字の「a」の両方を許容したい場合に非常に便利です。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string text = "CSharp";
// 大文字小文字を区別せずに「csharp」が含まれているか確認
string pattern = "csharp";
if (Regex.IsMatch(text, pattern, RegexOptions.IgnoreCase))
{
Console.WriteLine("キーワードが見つかりました(区別なし)。");
}
else
{
Console.WriteLine("キーワードは見つかりませんでした。");
}
}
}
実行結果は以下のようになります。
キーワードが見つかりました(区別なし)。
7. 文字列の置き換えを行う便利な方法
正規表現は、単に「合っているかどうか」を調べるだけではありません。特定のルールに基づいて、文字を別の文字に「置き換える」ことも得意です。これを専門用語で「置換(ちかん)」と呼びます。
例えば、文章の中にあるすべての数字を「*」という伏せ字に変えたいとします。これを普通の機能でやろうとすると、0から9まで順番に探さなければなりませんが、正規表現なら一瞬です。Regex.Replace という機能を使えば、パターンに一致した部分をまとめて指定した文字に変換できます。
この機能は、個人情報が含まれる文章から電話番号を隠したり、不適切な言葉を自動で修正したりするプログラムを作る際に非常に役立ちます。応用範囲が広く、データの整理や加工において必須のスキルと言えるでしょう。
8. エスケープ処理という重要な決まりごと
正規表現を学んでいると、時々 \(バックスラッシュまたは円記号)が出てくることに気づくでしょう。これは「エスケープ処理」と呼ばれる大切な役割を持っています。正規表現の世界では、ドット . やプラス + などの記号は特別な意味を持っていますが、これらを「ただの文字」として扱いたい場合もあります。
例えば、ドットを「どんな文字でもいい1文字」という意味ではなく、文章の終わりの「。」や「.」そのものとして探したいときは、\. と書く必要があります。このように、記号の持つ魔法の力を一時的に打ち消して、純粋な文字として認識させることをエスケープと言います。
また、C#のコード内で正規表現を書くときは、文字列の前に @ をつける「逐次(ちくじ)文字列リテラル」という書き方が推奨されます。これを付けることで、バックスラッシュをたくさん書く手間が省け、コードがとても読みやすくなります。初心者の方は、まずはおまじないとして @"..." の形を覚えておくと良いでしょう。
9. 正規表現を使いこなすための学習のヒント
ここまで、数値やメールアドレスの検証、置き換えなど、さまざまな活用方法を見てきました。正規表現は非常に強力ですが、一度にすべての記号を暗記する必要はありません。必要なときにその都度調べて、少しずつ使えるパターンを増やしていくのが上達のコツです。
最近では、自分が作りたいパターンを打ち込むと、それが正しいかどうかをリアルタイムで教えてくれる便利なWebサイトもたくさんあります。まずは、数字のチェックや簡単なキーワード検索から始めて、徐々に複雑な条件に挑戦してみてください。プログラムが自分の思い通りに文字を判別してくれるようになると、開発の楽しさがぐっと広がります。
C#という言語は、こうした文字の扱いがとても得意な言語です。正規表現をマスターすることで、データの入力チェックだけでなく、大量のテキストファイルから特定の情報を抜き出したり、ログファイルを分析したりといった高度な作業も効率よくこなせるようになります。一歩ずつ、着実にスキルを身につけていきましょう。