【C#】正規表現のエスケープを自動で安全に行う

C#

正規表現を使用する際、パターンに特殊文字をエスケープし忘れてエラーが発生したり、思うようにパターンマッチが行われなかったりすることは良くあります。本記事では、特殊文字のエスケープを自動で行う便利なメソッドを紹介します。

特殊文字をエスケープしない場合

特殊文字をエスケープしないと正規表現でマッチせず、意図通りの結果とならない。これは、”[]”が正規表現において特別な意味を持っているためです。たとえば [abc] は、a、b、c、のいずれか1文字に一致する、という正規表現の機能を持っています。今回のパターン “[特殊]文字” は、たまたま[]が含まれているため、正規表現の機能として扱われてしまいパターンマッチが失敗します。

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        // ユーザー入力を模擬する文字列
        string userInput = "これは[特殊]文字を含むテキストです。";

        // マッチさせたいパターン(エスケープ前)
        string pattern = "[特殊]文字";

        // 正規表現で使用するパターンを表示
        Console.WriteLine("パターンを表示: " + pattern);

        // エスケープされたパターンを使用して正規表現マッチングを行う
        bool isMatch = Regex.IsMatch(userInput, pattern);

        // マッチ結果を表示
        Console.WriteLine("入力文字列は正規表現にマッチするか?:" + isMatch);
    }
}

実行結果

パターンを表示: [特殊]文字
入力文字列は正規表現にマッチするか?:False

特殊文字をエスケープする

特殊文字をRegex.Escapeメソッドでエスケープします。これにより、パターン内の “[” が “\[” に置き換えられ通常の文字列となります。これにより “[特殊]文字” の括弧は任意の一文字を表す正規表現と扱われなくなり、パターンマッチが成功します。

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        // ユーザー入力を模擬する文字列
        string userInput = "これは[特殊]文字を含むテキストです。";

        // マッチさせたいパターン(エスケープ前)
        string pattern = "[特殊]文字";

        // 特殊文字をエスケープする ★
        string escapedPattern = Regex.Escape(pattern);

        // 正規表現で使用するパターンを表示
        Console.WriteLine("エスケープ後の文字列: " + escapedPattern);

        // エスケープされたパターンを使用して正規表現マッチングを行う
        bool isMatch = Regex.IsMatch(userInput, escapedPattern);

        // マッチ結果を表示
        Console.WriteLine("入力文字列は正規表現にマッチするか?:" + isMatch);
    }
}

実行結果

エスケープ後の文字列: \[特殊]文字
入力文字列は正規表現にマッチするか?:True
タイトルとURLをコピーしました