正規表現によるパターンマッチングの基礎
正規表現(Regular Expression)は、テキスト内の特定のパターンを抽出・検索するための強力なツールです。たとえば、電話番号の抽出、ファイル名に数字を含むものを探す、文章中の繰り返し単語を検出するといった処理に利用できます。
基本的な文字列マッチング
以下のSQLクエリでは、prod_name列に「luzhaoshan」という文字列を含むレコードを取得しています。
SELECT prod_name
FROM products
WHERE prod_name REGEXP 'luzhaoshan'
ORDER BY prod_name;
このクエリは、「jetback luzhaoshan」のような値を持つ行を正しく返します。一見すると通常の文字列検索と同じように見えますが、正規表現の真価は複雑なパターン検索で発揮されます。
任意文字のマッチング
ドット(.)は、任意の1文字にマッチするワイルドカードとして機能します。次の例では、末尾が「000」で終わる数値を含む製品名を検索しています。
SELECT prod_name
FROM products
WHERE prod_name REGEXP '.000'
ORDER BY prod_name;
この条件により、「2000」「8000」などの値が対象となり、以下のような結果が得られます:
- jetbaas 2000
- hsahg 8000
- jaas 2000
これはLIKE '%000'でも実現可能ですが、重要な違いがあります。
REGEXP と LIKE の違い
LIKEはデフォルトで列全体の一致を要求するのに対し、REGEXPは列の途中にパターンが含まれていてもマッチします。たとえば:
SELECT prod_name
FROM products
WHERE prod_name LIKE '000'
ORDER BY prod_name;
このクエリは通常、結果を返しません。なぜなら、列の値が完全に「000」でない限り一致しないからです。一方、次のようにすれば部分一致も可能になります:
SELECT prod_name
FROM products
WHERE prod_name REGEXP '.000';
この差異は非常に重要であり、部分文字列の検索においてREGEXPが優れた柔軟性を持つ理由です。REGEXPで完全一致を実現したい場合は、^(行頭)と$(行末)を使用します。
OR 条件の実装
パイプ記号(|)を使うことで、複数のパターンのいずれかに一致するものを検索できます。
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;
これにより、「1000」または「2000」を含む行が抽出され、OR句を使った複数条件の簡略化が可能です。3つ以上の選択肢も同様に扱えます:'1000|2000|3000'。
文字クラスによる範囲指定
角括弧([])を使って、特定の文字の集合や範囲を定義できます。
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123]ton'
ORDER BY prod_name;
このクエリは、「1ton」「2ton」「3ton」のいずれかを含む行にマッチします。これは[1|2|3]tonと等価です。
さらに、範囲表記も使用可能です:
[0-9]:0から9までの任意の数字[a-z]:aからzまでの任意の小文字アルファベット
たとえば:
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[1-5]ton';
この条件は、「1ton」から「5ton」まで、または「.5 ton snkil」のような部分にも反応します。
位置の指定:行頭と行末
先頭に^を付けると、文字列の開始位置でのみマッチします。たとえば、数字で始まる製品名を検索するには:
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9]\\.';
このクエリは、「1 ton anvil」や「2 ton anvil」など、数字で始まりピリオドで続く項目を抽出します。^は集合内では否定(NOT)の意味を持ちますが、パターンの先頭では「文字列の開始」を意味するため、文脈によって動作が変わります。
正規表現のテスト方法
テーブルを使わずに正規表現の動作を確認することもできます。MySQLでは以下のようにして評価できます:
SELECT 'hello' REGEXP '[0-9]';
この式は、'hello'に数字が含まれていないため、結果は0(不一致)を返します。一致した場合は1が返されます。この方法を使えば、複雑なパターンの検証を安全に行えます。