C#の正規表現Regex入門!初心者でも文字列検索やバリデーションがわかる徹底解説
生徒
「ユーザーが入力したメールアドレスが正しい形式かどうかをチェックしたいのですが、どうすればいいですか?」
先生
「それは正規表現、英語でRegex(レジェックス)という仕組みを使うと非常に簡単に解決できますよ。」
生徒
「正規表現って難しそうな名前ですね。プログラミング初心者でも使いこなせますか?」
先生
「基本のパターンさえ覚えれば大丈夫です。C#での書き方を基礎から丁寧に解説していきますね!」
1. 正規表現(Regex)とは?
正規表現とは、特定の文字の組み合わせをパターンとして表現する手法のことです。C#の世界ではRegex(レジェックス、またはリジェックス)と呼ばれます。これは、膨大な文章の中から特定の文字列を探し出したり、入力されたデータが決められた形式(電話番号や郵便番号など)を守っているかを確認したりする際に使われます。
例えば、私たちが普段の生活で「名前に『子』がつく人を探して」と頼むのと同じように、プログラムに対して「数字が3桁、ハイフン、数字が4桁の並びを探して」と命令できるのが正規表現の強みです。この技術を習得すると、複雑な文字列操作をたった一行のコードで記述できるようになります。
2. 正規表現を使うための準備
C#で正規表現を利用するには、まず「おまじない」が必要です。正規表現に関連する機能は、System.Text.RegularExpressionsという名前の箱の中にまとめられています。プログラムの冒頭でこれを呼び出すことで、正規表現の便利な機能がすべて使えるようになります。
プログラミング未経験の方にとって「名前空間」という言葉は難しく感じるかもしれませんが、要するに「正規表現専用の道具箱を今から使いますよ」と宣言することだと考えてください。この宣言がないと、パソコンは正規表現の命令を理解できずにエラーを出してしまいます。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string text = "私の誕生日は1990年です。";
string pattern = "1990";
if (Regex.IsMatch(text, pattern))
{
Console.WriteLine("見つかりました!");
}
}
}
見つかりました!
3. 文字列が含まれているか判定するIsMatch
もっとも基本的な使い方は、特定のキーワードが含まれているかどうかを判定することです。これにはRegex.IsMatchというメソッド(機能)を使います。このメソッドは、指定したパターンが対象の文字列の中に存在すれば「真(true)」、存在しなければ「偽(false)」という結果を返してくれます。
例えば、不適切な言葉が含まれていないかチェックする検閲システムや、特定のタグが含まれているかを確認する検索エンジンなどで幅広く活用されています。単純な文字列の比較と違い、正規表現を使えば「先頭にある場合だけ」や「語尾にある場合だけ」といった細かい指定も可能になります。初心者の方は、まずこの「一致するかどうかを調べる」という感覚を掴むことから始めましょう。
4. メタ文字でパターンを作る
正規表現の真価は「メタ文字」と呼ばれる特殊な記号にあります。メタ文字とは、特定の文字そのものを指すのではなく、文字の「種類」や「数」を表す記号のことです。これを組み合わせることで、特定の単語だけでなく、未知の文字列に対してもパターンを当てはめることができます。
代表的なメタ文字には以下のようなものがあります。
- \d:任意の数字(0から9まで)を表します。
- \w:英数字やアンダーバーを表します。
- .(ドット):何でもいいから一文字を表します。
- ^:行の先頭であることを表します。
- $:行の末尾であることを表します。
これらの記号をパズルのように組み合わせることで、「数字が続く場所」や「特定の文字で始まる文章」を自由自在に指定できるようになります。最初は暗号のように見えるかもしれませんが、一つずつ意味を理解すれば非常に強力な武器になります。
5. 数字のパターンを検索する実践例
それでは、具体的に数字を検索するプログラムを書いてみましょう。例えば、商品コードが「ID」に続いて数字が3つ並ぶという規則だった場合、正規表現を使えば一瞬で抽出できます。ここではRegex.Matchを使って、最初に見つかった箇所を取り出してみます。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "商品コードはID789です。";
// \d{3}は「数字が3回続く」という意味
string pattern = @"ID\d{3}";
Match match = Regex.Match(input, pattern);
if (match.Success)
{
Console.WriteLine("抽出結果: " + match.Value);
}
}
}
抽出結果: ID789
ここで登場した@マークは、C#でバックスラッシュ(円記号)をそのまま文字列として扱うための便利な記法です。正規表現を書くときは、この@を引用符の前に付けるのが一般的です。これを使わないと、複雑なエラーの原因になることが多いため、セットで覚えるのがプロへの近道です。
6. 文字列を置換するReplace
正規表現は検索するだけでなく、文字を置き換える際にも役立ちます。Regex.Replaceを使えば、パターンに一致した部分を別の文字に一括で変更できます。これは、データの書式を整えたり、個人情報を隠したりする際によく使われます。
例えば、電話番号のハイフンを取り除きたい、あるいは特定の記号を空白に変換したいといった要望に最適です。手動で一つ一つ書き換える必要がなく、プログラムが自動でルールに従って作業を代行してくれるため、人為的なミスを防ぐ効果もあります。事務作業の自動化など、実務に近い場面で重宝する機能と言えるでしょう。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string sentence = "今日の気温は25度、明日は28度です。";
// 数字の部分を「秘密」という文字に変える
string pattern = @"\d+";
string result = Regex.Replace(sentence, pattern, "秘密");
Console.WriteLine(result);
}
}
今日の気温は秘密度、明日は秘密度です。
7. 文字の繰り返しを指定する量指定子
正規表現では、あるパターンが何回繰り返されるかを指定することができます。これを「量指定子」と呼びます。例えば「数字が1回以上続く」や「特定の文字が0回か1回だけ現れる」といった柔軟な指定が可能です。これによって、郵便番号の3桁と4桁の組み合わせのような、桁数が決まったデータの検証が容易になります。
量指定子の主な種類には以下があります。
- +:1回以上の繰り返し。
- *:0回以上の繰り返し。
- ?:0回または1回のみ。
- {n}:ちょうどn回。
これらを使いこなすことで、曖昧な検索から厳密なチェックまで、状況に応じた使い分けができるようになります。プログラミング初心者のうちは、特によく使う+と{n}をマスターしておくだけでも、多くのタスクをこなせるようになるはずです。
8. 郵便番号のバリデーションを作ってみよう
応用編として、入力された文字が正しい郵便番号の形式(3桁の数字、ハイフン、4桁の数字)になっているかを判定するプログラムを作成しましょう。バリデーションとは、入力データが正しい形式かどうかを「検証」することを指すIT用語です。ウェブサイトの申し込みフォームなどで、入力ミスを指摘してくれる機能の裏側では、このような処理が動いています。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string zipCode1 = "123-4567";
string zipCode2 = "12-345";
// ^ は先頭、$ は末尾を表し、全体が一致するかを確認する
string pattern = @"^\d{3}-\d{4}$";
Console.WriteLine("zipCode1の判定: " + Regex.IsMatch(zipCode1, pattern));
Console.WriteLine("zipCode2の判定: " + Regex.IsMatch(zipCode2, pattern));
}
}
zipCode1の判定: True
zipCode2の判定: False
このプログラムでは、先頭から末尾までが完全にパターンに合致しているかを厳密にチェックしています。これを使えば、ユーザーの入力漏れや打ち間違いを即座に発見し、親切な案内を出すことができるようになります。プログラミングの世界で「品質を守る」ための第一歩ですね。
9. 正規表現を使う際の注意点
非常に便利な正規表現ですが、注意すべき点もあります。それは「複雑にしすぎないこと」です。あまりにも長くて複雑なパターンを書いてしまうと、後から見直したときに自分でも何を意図して書いたのかわからなくなってしまうことがあります。これをエンジニアの間では「読みづらいコード」と呼びます。
また、正規表現の処理は、単純な文字列比較に比べるとパソコンの計算力を多く必要とします。数千文字程度の処理であれば全く問題ありませんが、膨大なデータを扱う場合には処理速度に影響が出ることがあります。まずはシンプルで分かりやすいパターンを書くことを心がけ、慣れてきたら徐々に効率の良い書き方を学んでいくのが、挫折しないためのコツです。
10. 今後の学習の進め方
正規表現の世界は奥が深く、今回紹介したものはほんの一部に過ぎません。他にも「グループ化」や「否定」といった高度なテクニックがたくさんあります。しかし、最初からすべてを覚えようとする必要はありません。まずは身近なデータの形、例えば自分の電話番号や今日の日付を正規表現で表現してみることから始めてみてください。
パソコンの操作に不慣れな方でも、C#という言語を通じて正規表現を学べば、データの整理や検索が劇的に楽になることを実感できるはずです。正規表現は一度覚えると、C#だけでなく他のプログラミング言語(JavaScriptやPythonなど)でも共通して使える技術ですので、一生モノのスキルになります。一歩ずつ、楽しみながらコードを書いていきましょう。