はじめに
正規表現(Regex)は、文字列のパターンを定義し、特定の文字列を検索、抽出、置換するための強力なツールです。C# では、正規表現を扱うために System.Text.RegularExpressions
名前空間を使用します。本記事では、C# における正規表現パターンの構造と各要素の意味を詳しく解説します。
正規表現の基本構造
正規表現は、特定の文字列パターンを記述するための一連の文字や記号の組み合わせです。基本的な構造は以下の通りです。
- リテラル文字: 文字列中の文字そのものを表します(例:
abc
は “abc” にマッチ)。 - メタキャラクタ: 特別な意味を持つ文字で、パターンを指定するために使用されます(例:
.
、*
、+
など)。 - 量指定子: 直前の要素が何回出現するかを指定します(例:
*
は0回以上、+
は1回以上出現することを示します)。
主なメタキャラクタの解説
以下は、C# の正規表現でよく使用されるメタキャラクタとその意味です。
メタキャラクタ | 説明 | 例 |
---|---|---|
. |
任意の1文字にマッチ | a.b は “acb” にマッチ |
^ |
行の先頭にマッチ | ^Hello は “Hello world” にマッチ |
$ |
行の末尾にマッチ | world$ は “Hello world” にマッチ |
* |
直前の文字が0回以上出現 | a* は “”, “a”, “aa” にマッチ |
+ |
直前の文字が1回以上出現 | a+ は “a”, “aa” にマッチ |
? |
直前の文字が0回または1回出現 | a? は “”, “a” にマッチ |
{n} |
直前の文字がちょうどn回出現 | a{3} は “aaa” にマッチ |
{n,} |
直前の文字がn回以上出現 | a{2,} は “aa”, “aaa” にマッチ |
{n,m} |
直前の文字がn回以上m回以下出現 | a{2,4} は “aa”, “aaa”, “aaaa” にマッチ |
[] |
指定した文字のいずれか1文字にマッチ | [abc] は “a”, “b”, “c” にマッチ |
` | ` | OR条件を示す |
() |
グルーピングを行い、部分的なマッチを抽出する | (abc)+ は “abc”, “abcabc” にマッチ |
正規表現の例
例1: 電子メールアドレスの検証
using System; using System.Text.RegularExpressions; class Program { static void Main() { string emailPattern = @"^[\w\.-]+@[\w\.-]+\.\w+$"; string email = "example@example.com"; if (Regex.IsMatch(email, emailPattern)) { Console.WriteLine("有効なメールアドレスです。"); } else { Console.WriteLine("無効なメールアドレスです。"); } } }
この正規表現は、メールアドレスの形式を検証するために使われます。[\w\.-]+
はユーザー名部分、@
の後はドメイン部分を表し、最後の \w+
はトップレベルドメインを示しています。
例2: 電話番号の検証
string phonePattern = @"\d{3}-\d{3}-\d{4}"; string phone = "123-456-7890"; if (Regex.IsMatch(phone, phonePattern)) { Console.WriteLine("有効な電話番号です。"); } else { Console.WriteLine("無効な電話番号です。"); }
この正規表現は、米国の電話番号形式を検証します。{3}
と {4}
を使ってそれぞれの部分が正しい桁数であることを確認しています。
例3: URLの検証
string urlPattern = @"^(https?://)?([\w\-]+\.)+[\w\-]+(/[\w\-./?%&=]*)?$"; string url = "https://www.example.com/path/to/resource"; if (Regex.IsMatch(url, urlPattern)) { Console.WriteLine("有効なURLです。"); } else { Console.WriteLine("無効なURLです。"); }
この正規表現は、基本的なURLの形式を検証します。https?://
はオプションのHTTPまたはHTTPSを、([\w\-]+\.)+
はドメイン名部分を、/[\w\-./?%&=]*
はパスやクエリパラメータを表します。
例4: 日付の検証(YYYY-MM-DD形式)
string datePattern = @"^\d{4}-\d{2}-\d{2}$"; string date = "2024-11-02"; if (Regex.IsMatch(date, datePattern)) { Console.WriteLine("有効な日付形式です。"); } else { Console.WriteLine("無効な日付形式です。"); }
この正規表現は、日付が YYYY-MM-DD
の形式であるかを検証します。\d{4}
は4桁の年を、\d{2}
は2桁の月および日を示しています。
例5: アルファベットのみの文字列の検証
string alphabetPattern = @"^[A-Za-z]+$"; string input = "HelloWorld"; if (Regex.IsMatch(input, alphabetPattern)) { Console.WriteLine("アルファベットのみの文字列です。"); } else { Console.WriteLine("アルファベット以外の文字が含まれています。"); }
この正規表現は、入力文字列がアルファベット(大文字および小文字)だけで構成されているかを検証します。^[A-Za-z]+$
は、先頭から末尾までの間に1回以上のアルファベットがあることを示しています。
まとめ
本記事では、C# における正規表現の基本構造と各メタキャラクタの意味について解説しました。正規表現は、特定の文字列パターンを検索、検証、置換するための強力な手段であり、C# では System.Text.RegularExpressions
名前空間を通じて利用できます。
主なポイント
- 正規表現の基本構造:
- 正規表現は、リテラル文字とメタキャラクタの組み合わせで構成され、文字列パターンを定義します。
- メタキャラクタの理解:
- さまざまなメタキャラクタ(例:
.
、*
、+
、^
、$
など)の意味を理解することで、複雑なパターンを効果的に作成できます。
- さまざまなメタキャラクタ(例:
- 具体的な例:
- メールアドレスの検証パターンを用いて、正しい形式を確認する方法を示しました。
- 電話番号の検証に関する正規表現を通じて、特定の形式を確保する手法を解説しました。
- URLや日付、アルファベットのみの文字列の検証といった追加の例を挙げ、正規表現の幅広い適用方法を示しました。
- 注意点とベストプラクティス:
- エスケープ文字の使用や、正規表現のテスト、可読性を高める方法についても触れました。
正規表現は、データバリデーションや文字列処理を行う際に非常に役立つ技術です。この記事を参考に、C# における正規表現の基本を理解し、実践に役立てることで、より効率的なプログラミングが実現できるでしょう。今後も正規表現の応用を深め、さまざまな場面で活用していきましょう。
コメント