C#正規表現マスター!部分一致と完全一致を使い分ける初心者向け完全ガイド
生徒
「C#で特定の文字が含まれているか調べたいのですが、どうすればいいですか?」
先生
「それなら、正規表現(せいきひょうげん)という便利な仕組みを使うのが一番ですよ。部分一致や完全一致も自由自在です。」
生徒
「部分一致と完全一致って、何が違うんですか?初心者でも使い分けられますか?」
先生
「大丈夫ですよ。文字を探す時のルールの違いです。それでは、基本的な使い方を一緒に学んでいきましょう!」
1. 正規表現とは?初心者でもわかる基本の考え方
正規表現(せいきひょうげん)とは、一言で言うと「文字列のパターンを表現するための特別な書き方」のことです。例えば、たくさんの文章の中から「電話番号だけを探したい」とか「メールアドレスの形式になっているか確認したい」という時に非常に役立ちます。プログラミング言語のC#では、この正規表現を扱うための便利な機能があらかじめ用意されています。
パソコンを初めて触る方にとっては、少し難しく感じるかもしれませんが、要するに「虫眼鏡で特定の形を探すようなもの」だと考えてください。丸い形を探すのか、四角い形を探すのか、そのルールを決めるのが正規表現の役割です。C#で正規表現を使うには、System.Text.RegularExpressionsというおまじないのような名前の機能(名前空間と呼びます)を読み込む必要があります。
2. 部分一致と完全一致の決定的な違い
正規表現を使う上で、最初につまずきやすいのが「部分一致」と「完全一致」の使い分けです。この違いを理解することが、C#の正規表現を使いこなす第一歩になります。日常生活の例えで説明すると、非常に分かりやすくなります。
部分一致とは、文章の中に指定した文字が「含まれているかどうか」を調べることです。例えば、「今日のアイスは美味しい」という文章の中に「アイス」という言葉が入っているかを確認するのが部分一致です。文章全体がどうであれ、その中の一部にターゲットがいればOKというルールです。
一方で、完全一致とは、文章の最初から最後までが「指定したルールとぴったり同じかどうか」を調べることです。例えば、パスワードの設定などで「半角数字4桁だけで入力してください」というルールがある場合、1文字でも余計な文字が入っていたり、文字数が違ったりするとエラーになりますよね。これが完全一致の考え方です。入力された内容が、最初から最後まで、あなたの指定したルール通りになっているかを厳しくチェックします。
3. C#で部分一致を判定する方法
C#で部分一致を確認するには、IsMatch(イズマッチ)という命令を使います。これは、指定した文字列の中にパターンが見つかれば「はい(true)」、見つからなければ「いいえ(false)」という結果を返してくれる機能です。初心者の方は、まずはこのIsMatchを覚えることから始めましょう。以下のコードは、ある文章の中に「プログラミング」という単語が含まれているかを調べる例です。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string text = "私はC#でプログラミングを学んでいます。";
string pattern = "プログラミング";
// Regex.IsMatchを使って、部分一致を確認します
if (Regex.IsMatch(text, pattern))
{
Console.WriteLine("指定した文字が見つかりました!");
}
else
{
Console.WriteLine("見つかりませんでした。");
}
}
}
指定した文字が見つかりました!
このプログラムでは、変数textの中に「プログラミング」という文字が含まれているので、結果が表示されます。もしtextが「今日はいい天気です」であれば、結果は「見つかりませんでした」に変わります。このように、どこかに含まれていれば良いという判定が部分一致の基本です。
4. 完全一致に欠かせない記号「^」と「$」の使い方
完全一致を実現するためには、正規表現の特別な記号であるメタ文字を使う必要があります。特に重要なのが、「^」と「$」の2つです。これらは「ここから始まる」「ここで終わる」という意味を持っています。
「^」(ハット)は、文字列の先頭を表します。そして「$」(ドル)は、文字列の末尾を表します。これらを組み合わせて、パターンの前後に付けることで、「最初から最後までこのパターンでなければならない」という強制力を持たせることができます。例えば、数字3文字だけの完全一致を作りたい場合は、^...$のように書きます(※この場合のドットは任意の文字を表します)。
これを使わないと、どんなに厳しいルールを作っても、そのルールの前後に余計な文字が入っている場合に「部分一致」として判定されてしまいます。意図しない入力、例えば「abc123def」といった文字列を「123」というルールだけで判定すると、部分一致では通ってしまいますが、完全一致なら正しく弾くことができるのです。
5. C#で完全一致を実現する実践コード
それでは、実際に「^」と「$」を使った完全一致のコードを見てみましょう。今回は、郵便番号のような「数字3桁」というルールで考えてみます。完全一致を使うことで、余計な文字が混ざっていないかを厳格にチェックできるようになります。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
// チェックしたい文字列(3桁の数字かどうか)
string input1 = "123";
string input2 = "12345";
string input3 = "あ123い";
// ^ で始まり、$ で終わる。 \d{3} は数字が3つという意味です
string pattern = @"^\d{3}$";
Console.WriteLine("入力1の結果: " + Regex.IsMatch(input1, pattern));
Console.WriteLine("入力2の結果: " + Regex.IsMatch(input2, pattern));
Console.WriteLine("入力3の結果: " + Regex.IsMatch(input3, pattern));
}
}
入力1の結果: True
入力2の結果: False
入力3の結果: False
この結果を見てわかる通り、input1は数字3桁だけなので「True(正しい)」となります。しかし、input2は5桁あるので「False(間違い)」になり、input3は前後に文字が入っているので「False」になります。もしここで「^」と「$」を付け忘れると、全ての入力に「123」が含まれているため、全て「True」になってしまいます。これが完全一致の威力です。
6. 特定の文字から始まるかを判定する(前方一致)
応用編として、文章の「最初だけ」をチェックする方法を紹介します。これを前方一致(ぜんぽういっち)と呼びます。例えば、「こんにちは」から始まる挨拶だけに反応させたい場合などに使います。この場合は、先頭を意味する「^」だけを使います。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string greeting = "こんにちは、今日は良い天気ですね。";
string pattern = "^こんにちは";
if (Regex.IsMatch(greeting, pattern))
{
Console.WriteLine("丁寧な挨拶から始まっています。");
}
}
}
丁寧な挨拶から始まっています。
逆に、「お疲れ様でした。こんにちは。」という文章の場合、途中に「こんにちは」がありますが、先頭ではないため、この条件には当てはまりません。システムのログインチェックや、特定のコマンドを受け付けるプログラムを作る際に重宝するテクニックです。末尾だけで判定したい場合は、パターンの後ろに「$」をつける後方一致を使います。
7. 文字の種類を指定して入力チェックを行う
正規表現の真価は、文字の種類を指定できる点にあります。これまでは特定の単語を探してきましたが、「英単語だけ」「ひらがなだけ」といった指定が可能です。これを先ほどの完全一致と組み合わせることで、ユーザーが入力したデータが正しい形式かどうかを完璧に判定できるようになります。
例えば、ユーザー名に「半角の英小文字と数字だけ」を許可したい場合、[a-z0-9]という書き方を使います。これは「aからz、または0から9までのどれか1文字」という意味です。これに「1回以上繰り返す」という意味の「+」記号を足すと、文字数を問わない英数字チェックが作れます。では、実際のコードで確認してみましょう。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string userId = "user123";
// 小文字英数字のみで構成されているか最初から最後までチェック
string pattern = "^[a-z0-9]+$";
if (Regex.IsMatch(userId, pattern))
{
Console.WriteLine("有効なユーザーIDです。");
}
else
{
Console.WriteLine("使えない文字が含まれているか、形式が違います。");
}
}
}
有効なユーザーIDです。
もしuserIdに「User123」(大文字が含まれる)や「user 123」(スペースが含まれる)を入れると、このプログラムは正しく「使えない文字が含まれている」と判断してくれます。アプリやウェブサイトの会員登録画面などで、裏側で動いているのはまさにこのような仕組みなのです。
8. C#の正規表現でよく使う記号一覧表
最後に、これまでに出てきた記号や、よく使う便利な記号をまとめておきます。これらをパズルのように組み合わせることで、複雑な条件も作れるようになります。初心者の方は、この表を見ながら少しずつ試してみてください。
| 記号 | 読み方 | 意味 |
|---|---|---|
| ^ | ハット | 文字列の先頭から始まることを示す |
| $ | ドル | 文字列の末尾で終わることを示す |
| . | ドット | 何でもいい1文字(改行以外) |
| \d | バックスラッシュ・ディー | 数字(0から9のどれか) |
| \w | バックスラッシュ・ダブリュー | 英数字やアンダーバー |
| + | プラス | 直前の文字が1回以上繰り返される |
| * | アスタリスク | 直前の文字が0回以上繰り返される |
| ? | クエスチョン | 直前の文字があってもなくても良い(0か1回) |
これらの記号は、一見すると暗号のように見えますが、慣れてくると「言葉で説明するよりもずっと短く、正確にルールを伝えられる道具」になります。まずは「^」と「$」を忘れないようにすることから意識してみてください。部分一致が必要なら記号はなし、全体をきっちり調べたいなら前後を記号で囲む、というシンプルな使い分けからスタートしましょう。