今回は、C#での正規表現の使い方についてご紹介します。
正規表現とは
正規表現とは、文字列のパターン(規則)を定義し、特定の条件に合致する箇所を検索・抽出・置換などを行うための手法です。
単純な文字の一致から複雑なパターンの照合まで幅広く活用できます。
代表的な特殊文字としては .、^、$、*、+、?、{ }、[ ]、\、|、( ) などがあり、正規表現内で特別な意味を持ちます。
これらを適切に組み合わせることで、非常に柔軟なパターンマッチングが可能です。
C#における正規表現の基本的な使い方
C#で正規表現を扱う場合は、主に System.Text.RegularExpressions 名前空間を使用します。
たとえば Regex クラスは、パターンの定義・照合・置換などを行う中心的な役割を担います。
主なメソッドとしては以下のようなものがあります。
- Regex.IsMatch(string input, string pattern): 入力文字列がパターンに一致するかを判断します。
- Regex.Match(string input, string pattern): 一致した最初のマッチ情報を取得します。
- Regex.Matches(string input, string pattern): すべてのマッチ情報を列挙します。
- Regex.Replace(string input, string pattern, string replacement): マッチ箇所を置換します。
- Regex.Split(string input, string pattern): マッチ箇所を区切りとして文字列を分割します。
さらにオプションとして RegexOptions を指定できます。
- RegexOptions.IgnoreCase: 大文字小文字を区別しない
- RegexOptions.Multiline: 複数行モード
- RegexOptions.Compiled: パターンを事前コンパイルして実行速度を高める
これらを組み合わせることで、用途に応じた柔軟なパターンマッチングが実現できます。
実用的な具体例
郵便番号の形式チェック
たとえば日本の郵便番号(3桁-4桁)を判定するコードは以下のように書けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using System; using System.Text.RegularExpressions; class PostalCodeValidator { static void Main() { // パターン:3桁-4桁(例:123-4567) string pattern = @"^\d{3}-\d{4}$"; string input = "123-4567"; if(Regex.IsMatch(input, pattern)) { Console.WriteLine("正しい郵便番号形式です。"); } else { Console.WriteLine("郵便番号の形式が正しくありません。"); } } } |
正しい郵便番号形式です。
^\d{3}-\d{4}$ は、先頭から3桁の数字、その後にハイフン、続けて4桁の数字があるかをチェックします。
日付(YYYY-MM-DD形式)の抽出と分解
文字列中に含まれる日付を抽出し、年・月・日に分割する例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System; using System.Text.RegularExpressions; class DateExtractor { static void Main() { // 年、月、日をキャプチャするグループ化パターン string pattern = @"(\d{4})-(\d{2})-(\d{2})"; string input = "今日の日付は2025-02-25です。"; Match match = Regex.Match(input, pattern); if(match.Success) { string year = match.Groups[1].Value; string month = match.Groups[2].Value; string day = match.Groups[3].Value; Console.WriteLine($"年: {year}, 月: {month}, 日: {day}"); } else { Console.WriteLine("日付が見つかりませんでした。"); } } } |
年: 2025, 月: 02, 日: 25
このように丸括弧 () を用いることで、正規表現パターンの一部をキャプチャし、後から Groups プロパティでアクセスできます。
余分な空白の除去
複数の空白を1つにまとめる例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using System; using System.Text.RegularExpressions; class WhitespaceNormalizer { static void Main() { string input = "C# の 正規表現 を 学ぼう!"; // 複数の空白文字(スペースやタブなど)を単一スペースに置換 string pattern = @"\s+"; string replacement = " "; string result = Regex.Replace(input, pattern, replacement); Console.WriteLine(result); // "C# の 正規表現 を 学ぼう!" } } |
C# の 正規表現 を 学ぼう!
\s+ は1つ以上の空白文字を意味し、これを単一のスペースに置換することで読みやすい文字列に整形できます。
正規表現を扱う際の注意点
正規表現を使う場合、次の点に注意する必要があります。
- パフォーマンス: 複雑なパターンはバックトラッキングを増やす可能性があるため、パターン設計はなるべくシンプルにすることが望ましいです。
- RegexOptions.Compiled の利用: 頻繁に同じパターンを使う場合は事前コンパイルにより実行速度を高められますが、コンパイル自体に初期コストがあるため用途を吟味します。
- 入力データの検証: ユーザー入力をそのまま正規表現に渡すと、意図しない例外や脆弱性に繋がる可能性があります。
- Unicode とカルチャ依存: 特定の言語や文字種を扱う場合は、オプション設定やパターン設計の見直しが必要です。
- 可読性: 複雑なパターンはコメントやオプションを活用して保守しやすくすると良いでしょう。
まとめ
C#での正規表現は、Regex クラスや各種オプションを組み合わせることで、多様な文字列操作に対応できます。
本記事で取り上げた例をもとに、自身のプログラムで必要なパターンの設計と実装を検討してみてください。
正規表現を活用すれば、柔軟な入力チェックや置換ロジックがシンプルに記述できるようになります。