C#で開発をしていると、文字列処理が必要な場面が多くあります。その際に強力なツールとなるのが「正規表現」です。正規表現を使うことで、文字列の検索・抽出・置換・検証を効率的に行うことが可能になります。
本記事では、C#における正規表現の基本から応用まで、具体的なコード例を交えて解説します。
目次
1.C#の正規表現の基本
C#での文字列処理において、特定のパターンを検索・抽出・置換するために強力なツールとなるのが正規表現(Regex)です。例えば、メールアドレスのバリデーションやログデータの解析、特定のキーワード抽出など多くの場面で活用されています。
しかし、正規表現は記法が独特で初心者には難しく感じることもあります。本章では、C#における正規表現の基本を理解し、スムーズに使いこなせるようになるために正規表現とは何か、どのように扱うのかを詳しく解説します。
正規表現とは?
正規表現とは、特定のパターンを持つ文字列を検索・操作するための記法です。
C#では、System.Text.RegularExpressions名前空間にあるRegexクラスを利用することで、正規表現を簡単に扱うことができます。
例えば、次のようなパターンがよく使われます。
用途 | 正規表現 |
---|---|
メールアドレス | \w+@\w+\.\w+ |
URL | https?://\S+ |
電話番号 | \d{2,4}-\d{2,4}-\d{4} |
日付(YYYY-MM-DD) | \d{4}-\d{2}-\d{2} |
数字のみ | ^\d+$ |
C#で正規表現を扱う方法
C#では、主にRegexクラスを使用して正規表現を扱います。
例1:文字列からメールアドレスを抽出する
using System; using System.Text.RegularExpressions;
{ static void Main() { string text = "サンプルのメールアドレス: example@test.com"; string pattern = @"\w+@\w+\.\w+";
if (match.Success) { Console.WriteLine("一致: " + match.Value); } } }
一致: example@test.com |
例2:文字列が数値かどうかを判定する
bool isNumber = Regex.IsMatch("12345", @"^\d+$"); Console.WriteLine(isNumber); // True |
2.C#正規表現のエスケープ処理
C#の正規表現を使用する際、エスケープ処理が適切に行われていないために、思ったように動作しないという問題に直面することがあります。特に(.)や(\)などの特殊文字をそのまま検索しようとすると、意図しない結果になることがあるため、正しいエスケープの方法を理解しておくことが重要です。
エスケープが必要な特殊文字
正規表現には特別な意味を持つメタ文字があります。
メタ文字 | 説明 |
---|---|
. | 任意の1文字 |
* | 直前の文字の0回以上の繰り返し |
+ | 直前の文字の1回以上の繰り返し |
? | 直前の文字の0回または1回の出現 |
\d | 数字([0-9]と同じ) |
\w | 英数字([a-zA-Z0-9_]と同じ) |
\s | 空白文字(スペース、タブなど) |
エスケープ処理の実例
例えば、ドット(.)を含む文字列をそのまま検索する場合
string pattern = @"C\.#"; // 「C.#」を検索 |
また、C#の文字列リテラルでは(\)自体もエスケープが必要になるため、(@)を使うことが推奨されます。
string pattern = @"C\."; |
3.C#正規表現チェッカーとデバッグ
C#で正規表現を扱う際、思ったようにマッチしない、予期しない結果になるといったトラブルに遭遇することがあります。特に、複雑な正規表現を使用する場合、適切なデバッグ方法を知っておくことが重要です。
正規表現のテストツール
正規表現のデバッグには、以下の方法が便利です。
オンラインツールの活用
C#でのデバッグ
RegexOptionsを活用する(IgnoreCase, Multiline, Compiled など)
Regex regex = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); |
また、Visual Studioの「インタラクティブウィンドウ」を使ってC#のコードを実行しながらデバッグすることも可能です。
RegexOptionsを使ったデバッグ
C#のRegexOptionsを利用すると、正規表現の動作を変更できます。
RegexOptions | 説明 |
---|---|
IgnoreCase | 大文字・小文字を区別しない |
Multiline | ^と$を各行の先頭・末尾に適用 |
Singleline | .が改行を含めた任意の文字と一致 |
Compiled | 正規表現を事前コンパイルし、実行速度を向上 |
ExplicitCapture | 名前付きキャプチャグループのみを有効にする |
IgnorePatternWhitespace | パターン内の空白を無視し、#でコメントを記述可能 |
RightToLeft | 右から左へのマッチングを行う |
ECMAScript | ECMAScript準拠の正規表現構文を使用する |
例:大文字・小文字を無視するIgnoreCaseの使用
string text = "Hello World"; string pattern = "hello"; bool isMatch = Regex.IsMatch(text, pattern, RegexOptions.IgnoreCase); Console.WriteLine(isMatch); // True |
例:Compiledオプションを使用してパフォーマンスを向上
Regex regex = new Regex(@"\d+", RegexOptions.Compiled); Match match = regex.Match("ID: 12345"); Console.WriteLine(match.Value); // 12345 |
4.C#で文字列から特定の情報を抽出する
C#の正規表現を活用すると、特定のパターンに一致するデータを効率的に抽出できます。例えば、以下のような用途があります。
ユーザー入力の検証
メールアドレス・電話番号・郵便番号・クレジットカード番号のチェック
ログ解析
システムログやエラーログから特定の情報を抽出
データの抽出
HTML・JSON・CSV・XMLから特定の値を取得
文章解析
指定されたキーワードを含む文章の検索
テキスト処理
任意のパターンに一致する部分を抽出して、新しいデータセットを作成
本章では、MatchやMatchesメソッドを使って、さまざまなケースでのデータ抽出方法を詳しく解説します。
Matchメソッドを使って特定のデータを取得
Regex.Match()を使用すると、文字列内で最初に一致するパターンを取得できます。
using System; using System.Text.RegularExpressions;
{ static void Main() { string text = "商品コード: ABC123, 価格: 299円"; string pattern = @"[A-Z]{3}\d{3}"; // ABC + 数字3桁
if (match.Success) { Console.WriteLine("商品コード: " + match.Value); } } }
商品コード: ABC123 |
この例では、[A-Z]{3}\d{3}という正規表現を使って、3文字の英大文字+3桁の数字で構成された商品コードを抽出しています。
Matchesメソッドで複数の一致を取得
Regex.Matches()を使用すると、文字列内で複数の一致する部分をすべて取得できます。
string text = "価格リスト: 1500円, 3200円, 870円"; string pattern = @"\d+円"; // 「数字+円」のパターン
foreach (Match match in matches) { Console.WriteLine("金額: " + match.Value); }
金額: 1500円 金額: 3200円 金額: 870円 |
このコードでは、\d+円という正規表現を使用し、金額の部分をすべて取得しています。
Match.Groupsを使った詳細なデータ抽出
正規表現のグループ機能を活用すると、複数のデータを一度に取得できます。
string text = "イベント開催日: 2025-03-15"; string pattern = @"(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})"; // 年・月・日をキャプチャ
if (match.Success) { Console.WriteLine("年: " + match.Groups["year"].Value); Console.WriteLine("月: " + match.Groups["month"].Value); Console.WriteLine("日: " + match.Groups["day"].Value); }
年: 2025 月: 03 日: 15 |
(?<year>\d{4})のように(?<name>pattern)という形式でグループを作成すると、グループ名でデータを取得できます。
5.C#正規表現の書き方一覧
C#の正規表現を活用することで、さまざまな形式のデータを効率的に処理できます。ここでは、実際の開発でよく使われる正規表現のパターンを紹介し、それぞれの用途について詳しく解説します。
文字列の基本的なマッチングパターン
文字列の基本的なマッチングパターンを一覧でまとめました。
パターン | 説明 | 例 |
---|---|---|
. | 任意の1文字 | a.bはaxb, a9bにマッチ |
\d | 数字(0-9) | \d+は123, 42にマッチ |
\w | 英数字とアンダースコア(a-z,A-Z,0-9,_) | \w+はabc, A1B2, test_1にマッチ |
\s | 空白(スペース,タブ,改行) | \s+は" "や"\t", "\n"にマッチ |
\W | 英数字以外の1文字 | \W+は!@#, 空白, 記号にマッチ |
\D | 数字以外の1文字 | \D+はABC, xyzにマッチ |
^ | 行の先頭 | ^Helloは"Hello world"にマッチ |
$ | 行の末尾 | world$は"Hello world"にマッチ |
例えば、文字列内のすべての英単語を取得する例は下記の通りです。
string text = "Hello, this is a C# regex tutorial!"; string pattern = @"\w+";
foreach (Match match in matches) { Console.WriteLine("単語: " + match.Value); }
単語: Hello 単語: this 単語: is 単語: a 単語: C 単語: regex 単語: tutorial |
\w+を使用することで、英単語のみを抽出できます。
数値データの処理
数値を扱う場合、特定のフォーマットに一致するかどうかを検証できます。
パターン | 説明 | 例 |
---|---|---|
\d+ | 1桁以上の数字 | 123, 42にマッチ |
\d{3} | ちょうど3桁の数字 | 123, 999にマッチ |
\d{1,5} | 1〜5桁の数字 | 1, 12345にマッチ |
\d{2,} | 2桁以上の数字 | 12, 5678にマッチ |
例えば、5桁の社員番号を検出する際は下記のように記述します。
string text = "社員情報 A12345, S67890"; string pattern = @"\d{5}";
foreach (Match match in matches) { Console.WriteLine("社員番号: " + match.Value); }
社員番号: 12345 社員番号: 67890 |
メールアドレスの検証
メールアドレスは、一般的に次のような形式です。
ユーザー名 @ ドメイン名 . TLD |
例えばtest.user@example.comのような形式を正規表現でマッチさせます。
パターン | 説明 |
---|---|
[a-zA-Z0-9._%+-]+ | ユーザー名(英数字,.や-を含む) |
@ | @記号 |
[a-zA-Z0-9.-]+ | ドメイン名 |
\.[a-zA-Z]{2,} | .com, .net, .jpなどのTLD |
これらの正規表現パターンをコードに記述すると下記のようになります。
string email = "user@example.com"; string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
Console.WriteLine("メールアドレスの検証: " + isValid);
メールアドレスの検証: True |
URLの検出
URLを正規表現で抽出すると、テキスト内のリンクを解析できます。
文章内のURLをすべて抽出する例は下記の通りです。
string text = "公式サイト: https://example.com, 参考: http://test.net"; string pattern = @"https?://[^\s]+";
foreach (Match match in matches) { Console.WriteLine("URL: " + match.Value); }
URL: https://example.com URL: http://test.net |
https?://[^\s]+を使うことで、http://またはhttps://で始まるURLを抽出できます。
日付フォーマットの解析
日付データを扱う際に、特定のフォーマットに一致するかどうかを確認できます。
パターン | 説明 | 例 |
---|---|---|
\d{4}-\d{2}-\d{2} | YYYY-MM-DD | 2025-02-26 |
\d{2}/\d{2}/\d{4} | MM/DD/YYYY | 02/26/2025 |
\d{2}-\d{2}-\d{4} | DD-MM-YYYY | 26-02-2025 |
日付を検出する例は下記の通りです。
string text = "会議の日程: 2025-03-15"; string pattern = @"\d{4}-\d{2}-\d{2}";
Console.WriteLine("日付: " + match.Value);
日付: 2025-03-15 |
電話番号の抽出
日本の電話番号(市外局番付き)を検出する場合、以下の形式が考えられます。
03-1234-5678(東京の市外局番)
080-1234-5678(携帯番号)
日本の電話番号を検出する例は下記の通りです。
string text = "お問い合わせ: 080-1234-5678 または 03-9876-5432"; string pattern = @"\d{2,4}-\d{4}-\d{4}";
foreach (Match match in matches) { Console.WriteLine("電話番号: " + match.Value); }
電話番号: 080-1234-5678 電話番号: 03-9876-5432 |
6.C#正規表現で任意の文字列の扱い
任意の文字列を扱うには(.*)や(.+)を使用します。
string pattern = @"開始(.*?)終了"; string text = "開始ここに文章があります終了";
Console.WriteLine(match.Groups[1].Value);
ここに文章があります |
7.C#正規表現で数字を扱う方法
数字を検出するには(\d+)を使います。
string pattern = @"\d+"; string text = "商品の価格は2500円です。";
Console.WriteLine(match.Value);
2500 |
8.MatchメソッドとIsMatchメソッドの違い
Matchメソッドは一致する文字列を取得するメソッドの一方で、IsMatchメソッドは、一致するかどうかを判定するメソッドです。そのため、用途は異なります。
Matchメソッド
Match()は、一致する文字列を取得します。
Match match = Regex.Match("C#は素晴らしい言語", @"C#"); Console.WriteLine(match.Value);
C# |
IsMatchメソッド
IsMatch()は、一致するかどうか(true / false)を判定します。
bool isMatch = Regex.IsMatch("C#は素晴らしい言語", @"C#"); Console.WriteLine(isMatch);
True |
関連記事
C#とは?基本文法や特徴、メリット、開発分野まで初心者に必要な情報をわかりやすく解説
9.まとめ
本記事ではC#の正規表現(Regex)について、基礎から応用まで詳しく解説しました。
正規表現は便利なツールですが、パターンが複雑になると理解しにくくなることもあります。実務でスムーズに活用するためには、頻繁に使う正規表現のパターンを覚え、必要に応じてテストしながら調整することが重要です。
また、正規表現のパフォーマンスを意識することで、より高速で最適な文字列処理を実現できます。RegexOptions.Compiledを活用する、Lazy(最短一致)とGreedy(最長一致)を適切に使い分けるといったテクニックも、今後の開発に役立つでしょう。
本記事が皆様にとって少しでもお役に立てますと幸いです。
「フリーランスボード」は、数多くのフリーランスエージェントが掲載するITフリーランスエンジニア・ITフリーランス向けの案件・求人を一括検索できるサイトです。
開発環境、職種、単価、稼働形態、稼働日数など様々な条件から、あなたに最適なフリーランス案件・求人を簡単に見つけることができます。
単価アップを目指す方や、自分の得意なスキルを活かせる案件に参画したい方は、ぜひ「フリーランスボード」をご利用ください。