正規表現を使用する際、パターンに特殊文字をエスケープし忘れてエラーが発生したり、思うようにパターンマッチが行われなかったりすることは良くあります。本記事では、特殊文字のエスケープを自動で行う便利なメソッドを紹介します。
特殊文字をエスケープしない場合
特殊文字をエスケープしないと正規表現でマッチせず、意図通りの結果とならない。これは、”[]”が正規表現において特別な意味を持っているためです。たとえば [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
まとめ
本記事では、正規表現を使用する際に、特殊文字のエスケープを自動で行う便利なメソッドを紹介しました。