メインコンテンツまでスキップ
バージョン: 4.x

REGEXP

Description

文字列strに対して正規表現マッチを実行し、マッチが成功した場合はtrueを、そうでなければfalseを返します。patternは正規表現パターンです。 文字セットマッチングを処理する際は、Utf-8標準文字クラスを使用する必要があることに注意してください。これにより、関数が異なる言語の様々な文字を正しく識別し処理できることが保証されます。

patternが許可されていないregexp正規表現の場合、エラーを投げます。

サポートされている文字マッチクラス : https://github.com/google/re2/wiki/Syntax

Syntax

REGEXP(<str>, <pattern>)

パラメータ

パラメータ説明
<str>文字列型。正規表現とマッチングする文字列を表し、テーブルの列またはリテラル文字列を指定できます。
<pattern>文字列型。文字列 とのマッチングに使用される正規表現パターン。正規表現は、文字クラス、量詞、アンカーを含む複雑な検索パターンを定義する強力な方法を提供します。

戻り値

REGEXP関数はBOOLEAN値を返します。文字列 が正規表現パターン にマッチする場合、関数はtrue(SQLでは1として表現)を返し、マッチしない場合はfalse(SQLでは0として表現)を返します。

デフォルト動作:

デフォルト設定動作
. が改行にマッチ. はデフォルトで \n(改行)にマッチできます。
大文字小文字を区別マッチングは大文字小文字を区別します。
^/$ が文字列全体の境界にマッチ^ は文字列の開始のみ、$ は文字列の終了のみにマッチし、行の開始/終了にはマッチしません。
貪欲量詞*+ などはデフォルトで可能な限り多くマッチします。
UTF-8文字列はUTF-8として処理されます。

パターン修飾子:

pattern の前に (?flags) を付けることで、デフォルト動作を上書きできます。複数の修飾子を組み合わせることができます(例:(?im))。- プレフィックスは対応するオプションを無効にします(例:(?-s))。

フラグ意味
(?i)大文字小文字を区別しないマッチング
(?-i)大文字小文字を区別する(デフォルト)
(?s). が改行にマッチ(デフォルトで有効)
(?-s). が改行にマッチしない
(?m)複数行モード:^ が各行の開始、$ が各行の終了にマッチ
(?-m)単一行モード:^/$ が文字列全体の境界にマッチ(デフォルト)
(?U)非貪欲量詞:*+ などが可能な限り少なくマッチ
(?-U)貪欲量詞(デフォルト):*+ などが可能な限り多くマッチ

CREATE TABLE test ( k1 VARCHAR(255) ) properties("replication_num"="1")

INSERT INTO test (k1) VALUES ('billie eillish'), ('It\'s ok'), ('billie jean'), ('hello world');
--- Find all data in the k1 column starting with 'billie'
SELECT k1 FROM test WHERE k1 REGEXP '^billie'
--------------

+----------------+
| k1 |
+----------------+
| billie eillish |
| billie jean |
+----------------+
2 rows in set (0.02 sec)

--- Find data in the k1 column ending with 'ok':
SELECT k1 FROM test WHERE k1 REGEXP 'ok$'
--------------

+---------+
| k1 |
+---------+
| It's ok |
+---------+
1 row in set (0.03 sec)

中国語文字の例

mysql> select regexp('这是一段中文 This is a passage in English 1234567', '\\p{Han}');
+-----------------------------------------------------------------------------+
| ('这是一段中文 This is a passage in English 1234567' regexp '\p{Han}') |
+-----------------------------------------------------------------------------+
| 1 |
+-----------------------------------------------------------------------------+

単純文字列マッチングの挿入とテスト

CREATE TABLE test_regexp (
id INT,
name VARCHAR(255)
) PROPERTIES("replication_num"="1");

INSERT INTO test_regexp (id, name) VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie'),
(4, 'David');

-- Find all names starting with 'A'
SELECT id, name FROM test_regexp WHERE name REGEXP '^A';
+------+-------+
| id | name |
+------+-------+
| 1 | Alice |
+------+-------+

特殊文字マッチングテスト

-- Insert names with special characters
INSERT INTO test_regexp (id, name) VALUES
(5, 'Anna-Maria'),
(6, 'John_Doe');

-- Find names containing the '-' character
SELECT id, name FROM test_regexp WHERE name REGEXP '-';
+------+------------+
| id | name |
+------+------------+
| 5 | Anna-Maria |
+------+------------+

文字列終端マッチングのテスト

-- Find names ending with 'e'
SELECT id, name FROM test_regexp WHERE name REGEXP 'e$';
+------+---------+
| id | name |
+------+---------+
| 1 | Alice |
| 3 | Charlie |
+------+---------+

絵文字テスト

SELECT 'Hello' REGEXP '😀'; 
+-----------------------+
| 'Hello' REGEXP '😀' |
+-----------------------+
| 0 |
+-----------------------+

'str'がNULLの場合、NULLを返す

mysql> SELECT REGEXP(NULL, '^billie');
+-------------------------+
| REGEXP(NULL, '^billie') |
+-------------------------+
| NULL |
+-------------------------+

'pattern'がNULLの場合、NULLを返す

mysql> SELECT REGEXP('billie eillish', NULL);
+--------------------------------+
| REGEXP('billie eillish', NULL) |
+--------------------------------+
| NULL |
+--------------------------------+

すべてのパラメータがNULLの場合、NULLを返す

mysql> SELECT REGEXP(NULL, NULL);
+--------------------+
| REGEXP(NULL, NULL) |
+--------------------+
| NULL |
+--------------------+

patternが正規表現として許可されていない場合は、エラーをスローします。

SELECT REGEXP('Hello, World!', '([a-z');
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.2)[INTERNAL_ERROR]Invalid regex expression: ([a-z

パターン修飾子

大文字小文字を区別しないマッチング: (?i) はマッチ時に大文字小文字を無視します

SELECT REGEXP('Hello World', 'hello') AS case_sensitive, REGEXP('Hello World', '(?i)hello') AS case_insensitive;
+----------------+------------------+
| case_sensitive | case_insensitive |
+----------------+------------------+
| 0 | 1 |
+----------------+------------------+

デフォルトでは.は改行文字にマッチします。(?-s)を使用すると、.は改行文字にマッチしません。

SELECT REGEXP('foo\nbar', '^.+$') AS dot_match_nl, REGEXP('foo\nbar', '(?-s)^.+$') AS dot_not_match_nl;
+--------------+------------------+
| dot_match_nl | dot_not_match_nl |
+--------------+------------------+
| 1 | 0 |
+--------------+------------------+

マルチラインモード: (?m)^$ を各行の開始/終了にマッチさせます

SELECT REGEXP('foo\nbar', '^bar') AS single_line, REGEXP('foo\nbar', '(?m)^bar') AS multi_line;
+-------------+------------+
| single_line | multi_line |
+-------------+------------+
| 0 | 1 |
+-------------+------------+

貪欲 vs 非貪欲: (?U)は量詞を可能な限り少なくマッチさせます

SELECT REGEXP_EXTRACT('aXbXc', '(a.*X)', 1) AS greedy,
REGEXP_EXTRACT('aXbXc', '(?U)(a.*X)', 1) AS non_greedy;
+--------+------------+
| greedy | non_greedy |
+--------+------------+
| aXbX | aX |
+--------+------------+