はじめに
正規表現(Regular Expressions)は、文字列のパターンマッチングや操作を行うための非常に強力なツールです。C#では、Regexクラスを利用して正規表現を用いた文字列の検索、抽出、置換を簡単に行うことができます。正規表現は日常的なプログラミングタスクで頻繁に登場し、たとえば電話番号やメールアドレスのバリデーション、テキストの置換、ログデータからのパターン抽出など、多くの場面で活用されます。本記事では、C#のRegexクラスを使って、正規表現をどのように活用できるかを詳しく解説します。特に、Match、Matches、Replaceの3つの主要メソッドを中心に、その基本と応用を学んでいきましょう。
Regexクラスの基本と正規表現の構文
C#で正規表現を扱うためには、System.Text.RegularExpressions名前空間をインポートし、Regexクラスを使用します。Regexクラスは、正規表現パターンに基づいた文字列操作を行うための主要なクラスであり、これを使うことで複雑な文字列処理が簡単に行えます。
Regexクラスの使用方法
まずは、Regexクラスを使って、特定のパターンに一致する文字列を見つける基本的な方法を確認します。以下のコードでは、正規表現を使って文字列内の数字を検索しています。
using System.Text.RegularExpressions;
Regex regex = new Regex(@"\d+");
この例では、\d+という正規表現パターンを使っています。\dは「数字」を意味し、+は「1回以上の繰り返し」を表します。このため、上記のパターンは「1つ以上の連続する数字」にマッチします。Regexクラスを使ってパターンマッチングや文字列操作を行う際、このような正規表現パターンを使用します。
正規表現の基本構文
正規表現には、多くの特別な記号やパターンが用意されています。以下に、よく使われる基本的な正規表現の構文をいくつか紹介します。
\d:数字にマッチ(0-9)\w:単語文字(英数字とアンダースコア)にマッチ.:任意の1文字にマッチ*:直前の文字が0回以上繰り返される+:直前の文字が1回以上繰り返される?:直前の文字が0回または1回^:行頭にマッチ$:行末にマッチ
これらの基本構文を理解しておくことで、より高度な正規表現を作成でき、複雑な文字列パターンを効率的に処理できるようになります。
Matchメソッド:最初の一致を取得する
Regex.Matchメソッドは、文字列内で指定した正規表現に最初に一致する部分を検索して返します。最初の一致部分のみを取得したい場合、このメソッドが役立ちます。
Matchメソッドの基本例
次の例では、文字列内で最初に見つかった数字を検索して出力しています。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "私の電話番号は123-4567です。";
Regex regex = new Regex(@"\d+");
Match match = regex.Match(input);
if (match.Success)
{
Console.WriteLine("最初に見つかった数字: " + match.Value); // 出力: 123
}
}
}
Matchメソッドは、最初に一致した部分のみを返し、その結果をMatchオブジェクトとして扱います。このMatchオブジェクトには、マッチした文字列の値や、マッチした位置などの情報が含まれています。
Matchオブジェクトのプロパティ
Matchオブジェクトには、以下のようなプロパティがあります。
Value:一致した部分の文字列Index:一致部分の開始位置Length:一致部分の長さSuccess:一致が成功したかどうかを示すブール値
これらのプロパティを活用することで、より詳細なマッチング結果を扱うことができます。
Matchesメソッド:複数の一致を取得する
Regex.Matchesメソッドは、文字列内で指定した正規表現に一致するすべての部分を検索して返します。複数の一致部分を一度に取得したい場合にこのメソッドを使用します。
Matchesメソッドの基本例
次のコードでは、文中に含まれるすべての数字を検索して出力しています。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "2023年、私の電話番号は123-4567で、郵便番号は987-6543です。";
Regex regex = new Regex(@"\d+");
MatchCollection matches = regex.Matches(input);
foreach (Match match in matches)
{
Console.WriteLine("見つかった数字: " + match.Value);
}
}
}
このコードでは、Matchesメソッドを使って、文中のすべての数字を検索し、結果として2023、123、4567、987、6543が出力されます。Matchesメソッドは、すべての一致部分をMatchCollectionオブジェクトとして返します。
MatchCollectionと反復処理
MatchCollectionは複数のMatchオブジェクトを含むコレクションであり、foreachループを使用して各Matchオブジェクトにアクセスできます。これにより、文字列全体の中から複数の一致部分を効率的に処理することが可能です。
Replaceメソッド:文字列の置換
Regex.Replaceメソッドは、正規表現に一致する部分を別の文字列に置換するために使用されます。このメソッドを使用することで、特定のパターンに一致する文字列を効率よく変更することができます。
Replaceメソッドの基本例
次の例では、文中のすべての数字を「#」に置き換えています。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "2023年、私の電話番号は123-4567です。";
Regex regex = new Regex(@"\d+");
string result = regex.Replace(input, "#");
Console.WriteLine(result);
}
}
このコードの結果として、数字がすべて「#」に置き換わり、####年、私の電話番号は###-####です。という文字列が出力されます。
動的な置換
Regex.Replaceメソッドでは、カスタムロジックを使用した動的な置換も可能です。次の例では、数字を「*」で囲んで置換するカスタム処理を行っています。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "2023年、私の電話番号は123-4567です。";
Regex regex = new Regex(@"\d+");
string result = regex.Replace(input, match => "*" + match.Value + "*");
Console.WriteLine(result);
}
}
このコードの結果として、数字が*2023*年、私の電話番号は*123*-*4567*です。のように置き換えられます。
応用的な正規表現の使用例
正規表現は、単純なパターンマッチングだけでなく、さまざまな用途に応用できます。ここでは、いくつかの応用例を紹介します。
例1:メールアドレスの検出
正規表現を使用して、文中からメールアドレスを検出する方法です。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "お問い合わせはinfo@example.comまで。";
Regex regex = new Regex(@"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}");
Match match = regex.Match(input);
if (match.Success)
{
Console.WriteLine("見つかったメールアドレス: " + match.Value);
}
}
}
このコードでは、文中に含まれるメールアドレスを検出し、info@example.comが出力されます。
例2:日付フォーマットの検出
次に、日付フォーマットを正規表現で検出する例です。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string input = "今日は2024/09/15です。";
Regex regex = new Regex(@"\d{4}/\d{2}/\d{2}");
Match match = regex.Match(input);
if (match.Success)
{
Console.WriteLine("見つかった日付: " + match.Value);
}
}
}
このコードでは、日付フォーマット2024/09/15が正しく検出され、出力されます。
まとめ
正規表現は、文字列操作を効率化するための非常に強力なツールです。本記事では、C#のRegexクラスを使用して、正規表現を活用する方法について詳しく解説しました。Match、Matches、Replaceメソッドを中心に、基本的な使い方から応用的なパターンマッチングや置換までをカバーしました。正規表現は最初は難しく感じるかもしれませんが、練習を重ねることで、日常のプログラミングタスクをより効率的に行えるようになります。

