C#の正規表現(Regex)は、デフォルトでは大文字と小文字を厳密に区別します(例:"Apple" と "apple" は別物として扱われます)。
ユーザー入力の揺らぎを許容したい場合など、これらを区別せずにマッチさせるには、RegexOptions.IgnoreCase オプションを指定します。
目次
SQLキーワード検索の実装例
以下のサンプルコードでは、SQL文の中に含まれる予約語(SELECT, FROM, WHERE など)を、大文字・小文字の書き方に関わらずすべて抽出しています。
サンプルコード
using System;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
// 解析対象の文字列(SQLクエリ)
// 大文字(SELECT)、小文字(where)、混在(From)が混ざっている状態
string sqlQuery = "SELECT id, name From users where active = 1 AND role = 'admin'";
Console.WriteLine($"対象クエリ: {sqlQuery}\n");
// 検索したいキーワードのパターン
// \b : 単語の境界
string pattern = @"\b(select|from|where|and)\b";
// ---------------------------------------------------------
// 第3引数に RegexOptions.IgnoreCase を指定
// これにより "select" というパターンで "SELECT" にもヒットするようになる
// ---------------------------------------------------------
MatchCollection matches = Regex.Matches(sqlQuery, pattern, RegexOptions.IgnoreCase);
Console.WriteLine($"--- 発見したキーワード (計{matches.Count}個) ---");
foreach (Match m in matches)
{
// m.Value : 実際にマッチした文字列(元の文字列のまま)
// m.Index : 発見した位置
Console.WriteLine($"位置 {m.Index, 2}: {m.Value}");
}
}
}
実行結果
対象クエリ: SELECT id, name From users where active = 1 AND role = 'admin'
--- 発見したキーワード (計4個) ---
位置 0: SELECT
位置 16: From
位置 27: where
位置 44: AND
解説と技術的なポイント
1. RegexOptions.IgnoreCase
Regex.Matches や Regex.IsMatch などのメソッドには、第3引数(または第2引数)として RegexOptions 列挙体を受け取るオーバーロードが存在します。ここに RegexOptions.IgnoreCase を渡すことで、アルファベットの A と a を等価として扱います。
2. インラインオプション (?i)
コード側でオプションを指定する代わりに、正規表現パターンの中にオプションを埋め込む記法もあります。 パターンの先頭に (?i) を記述すると、それ以降の部分は大文字小文字を区別しなくなります。
// コードでの指定なしで、大文字小文字を無視するパターン
var matches = Regex.Matches(text, @"(?i)\b(select|from)\b");
この方法は、使用するライブラリの制限などで RegexOptions を引数に渡せない場合や、パターン文字列だけで挙動を完結させたい場合に有効です。
