description |
OceanBaseデータベースのMySQLモードでクエリを実行する際の正規表現の使用方法とベストプラクティス |
|---|---|
| keywords | 正規表現,regexp,rlike,クエリ,文字列マッチング |
| dir-name | |
| dir-name-en | |
| tenant-type | MySQL Mode |
正規表現は、特定のパターンに一致するテキストを文字列内で検索し、操作するためのパターンマッチングツールです。OceanBaseデータベースV4.1.0以降は、MySQL 8.0の正規表現機能と完全に互換性があり、POSIX 1003.2標準の拡張正規表現構文をサポートしています。
OceanBaseはICU正規表現エンジンを使用し、高性能な正規表現のマッチングと操作機能を提供します。また、より優れたパフォーマンスを得るために、オプションとしてHyperscan正規表現エンジンもサポートしています。
正規表現関数と演算子
OceanBaseのMySQLモードは、以下の正規表現関連の関数と演算子を提供します:
名前 |
説明 |
|---|---|
| REGEXP | 文字列が正規表現に一致するかどうかを判定します。 |
| NOT REGEXP | 文字列が正規表現に一致しないかどうかを判定します。 |
| RLIKE | REGEXPの同義語です。 |
| REGEXP_LIKE | 正規表現マッチング関数です。 |
| REGEXP_INSTR | 一致する部分文字列の開始位置を返します。 |
| REGEXP_REPLACE | 正規表現による置換を行います。 |
| REGEXP_SUBSTR | 一致する部分文字列を返します。 |
基本構文
簡単なマッチング
-- 基本マッチング
SELECT 'hello world' REGEXP 'hello'; -- 1を返す (一致)
SELECT 'hello world' REGEXP 'goodbye'; -- 0を返す (不一致)
-- RLIKEの使用
SELECT 'hello world' RLIKE '^hello'; -- 1を返す (helloで始まる)
文字クラスと量化詞
-- ドットは任意の文字にマッチします
SELECT 'abc' REGEXP 'a.c'; -- 1を返す
-- 文字クラス [abc] は a、b、または c にマッチします
SELECT 'bat' REGEXP '[abc]at'; -- 1を返す
-- 量化詞 * (0回以上)、+ (1回以上)、? (0回または1回)
SELECT 'caaat' REGEXP 'ca*t'; -- 1を返す (aは0回以上出現)
SELECT 'caaat' REGEXP 'ca+t'; -- 1を返す (aは1回以上出現)
SELECT 'cat' REGEXP 'ca?t'; -- 1を返す (aは0回または1回出現)
アンカーポイント
-- ^ は文字列の先頭にマッチします
SELECT 'hello world' REGEXP '^hello'; -- 1を返す
-- $ は文字列の末尾にマッチします
SELECT 'hello world' REGEXP 'world$'; -- 1を返す
-- \b は単語の境界にマッチします
SELECT 'hello world' REGEXP 'world\b'; -- 1を返す
グループ化と参照
-- 括弧 () はグループ化に使用されます
SELECT 'abab' REGEXP '(ab)+'; -- 1を返す
-- 逆参照 \1, \2 など
SELECT 'abab' REGEXP '(ab)\1'; -- 1を返す
文字クラス
標準文字クラス
文字クラス |
意味 |
|---|---|
[[:alnum:]] |
アルファベットと数字の文字 |
[[:alpha:]] |
アルファベットの文字 |
[[:blank:]] |
空白文字(スペースとタブ) |
[[:cntrl:]] |
制御文字 |
[[:digit:]] |
数字の文字 |
[[:graph:]] |
印刷可能な文字(スペースを除く) |
[[:lower:]] |
小文字 |
[[:print:]] |
印刷可能な文字(スペースを含む) |
[[:punct:]] |
点字 |
[[:space:]] |
空白文字(改行文字、キャリッジリターン文字などを含む) |
[[:upper:]] |
大文字 |
[[:xdigit:]] |
16進数の数字 |
-- 文字クラスの使用
SELECT 'abc123' REGEXP '[[:alnum:]]+'; -- 1を返す
SELECT 'hello' REGEXP '[[:alpha:]]+'; -- 1を返す
SELECT '123' REGEXP '[[:digit:]]+'; -- 1を返す
特殊文字クラス
-- POSIX文字クラス
SELECT 'a1' REGEXP '[[:alnum:]]'; -- 1を返す
SELECT 'A' REGEXP '[[:upper:]]'; -- 1を返す
SELECT 'a' REGEXP '[[:lower:]]'; -- 1を返す
-- 等価クラス [=character=]
SELECT 'a' REGEXP '[[=a=]]'; -- 1を返す
-- 整理要素 [.character.]
SELECT '.' REGEXP '[[..]]'; -- 1を返す
エスケープ文字
正規表現では、一部の文字には特殊な意味があります。これらの文字自体をマッチさせる場合は、バックスラッシュ \ を使用してエスケープする必要があります。
特殊文字 |
エスケープ表記 |
|---|---|
. |
\. |
* |
\* |
+ |
\+ |
? |
\? |
^ |
\^ |
$ |
\$ |
( |
\( |
) |
\) |
[ |
\[ |
] |
\] |
{ |
\{ |
} |
\} |
| |
\| |
\ |
\\ |
-- エスケープの例
SELECT 'a.c' REGEXP 'a\.c'; -- 1を返す (リテラルのピリオドにマッチ)
SELECT 'a*c' REGEXP 'a\*c'; -- 1を返す (リテラルのアスタリスクにマッチ)
SELECT 'a+c' REGEXP 'a\+c'; -- 0を返す (リテラルのプラス記号にマッチしない)
SELECT 'price: $100' REGEXP '\\$'; -- 1を返す (ドル記号にマッチ)
文字セットと照合順序
正規表現の操作は、入力文字列と正規パターンパラメータの文字セットおよび照合順序に基づいて、マッチング動作と比較方法を決定します:
- パラメータに異なる文字セットまたは照合順序が設定されている場合、強制的なルールが適用されます。
- いずれかのパラメータがバイナリ文字列の場合、そのパラメータはバイナリ文字列として大文字小文字を区別して処理されます。
- UTF-8、UTF-16 など、さまざまな文字セットをサポートしています。
-- 文字セットの例
SELECT 'OceanBase' REGEXP 'oceanbase'; -- 0を返す (大文字小文字を区別)
-- バイナリ比較の例 (バイナリ照合順序の文字セットを使用する場合)
SELECT _utf8mb4'OceanBase' COLLATE utf8mb4_bin REGEXP _utf8mb4'oceanbase' COLLATE utf8mb4_bin; -- 0を返す
注意
OceanBaseでは、REGEXP 関数で直接 BINARY キーワードを使用することはサポートされていません。バイナリ比較が必要な場合は、COLLATE 句を使用してバイナリ照合順序の文字セットを指定してください。
パフォーマンス最適化
OceanBaseのMySQLモードは、正規表現に対して複数のパフォーマンス最適化を施しています:
- 式キャッシュ:コンパイル済みの正規表現はキャッシュされ、再利用できます。
- 定数最適化:定数パターンの正規表現に対して、高速な計算パスを提供します。
- メモリ管理:効率的な一時メモリの割り当てと管理を行います。
注意
複雑な正規表現はクエリのパフォーマンスに影響を与える可能性があります。高並行環境では慎重に使用し、データベースのインデックスを活用してクエリ性能を最適化することを検討してください。
適用シナリオ
データ抽出
-- 文字列から数字を抽出
SELECT REGEXP_SUBSTR('Price: $123.45', '\\d+\\.\\d+') AS price;
-- URLからドメイン名を抽出
SELECT REGEXP_SUBSTR('https://www.example.com/path', 'https?://([^/]+)') AS domain;
データクレンジング
-- 不要な空白文字を削除
SELECT REGEXP_REPLACE('hello world', '\\s+', ' ') AS cleaned_text;
-- 電話番号をフォーマット
SELECT REGEXP_REPLACE('12345678901', '(\\d{3})(\\d{4})(\\d{4})', '$1-$2-$3') AS formatted_phone;