【MySQL】REGEXP:正規表現で検索する方法


ここではMySQLで、REGEXPを使って正規表現で検索する方法を紹介しています。

正規表現の一覧

MySQLで使える正規表現の主な一覧は次の通りです。

項目 内容
^ 文字列の先頭に一致する
$ 文字列の末尾に一致する
. 任意の1文字に一致する
* 直前の文字の 0 回以上の繰り返しに一致する
+ 直前の文字の 1 回以上の繰り返しに一致する
? 直前の文字の 0 回か 1 回に一致する
abc|def abcまたはdef の文字列に一致する
(abc)* abcのゼロ個以上の繰り返しに一致する
[abc] a,b,cのいずれかの値と一致する
[a-c] aからcのいずれかの値と一致する
[^a-c] aからc以外の値と一致する

正規表現を使ったSQLサンプル

mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00001  | Suzuki   | HR    |   28 |
| 00002  | Tanaka   | SALES |   25 |
| 00003  | Kizaki   | SALES |   35 |
| 00004  | Tanaka   | DEV   |   45 |
| 00005  | Kizaki   | DEV   |   55 |
| 00006  | Nakata   | DEV   |   35 |
+--------+----------+-------+------+
6 rows in set (0.09 sec)

^:文字列の先頭に一致する

mysql> SELECT * FROM tab1 WHERE emp_name REGEXP '^Ta';
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00002  | Tanaka   | SALES |   25 |
| 00004  | Tanaka   | DEV   |   45 |
+--------+----------+-------+------+
2 rows in set (0.00 sec)

$:文字列の末尾に一致する

mysql> SELECT * FROM tab1 WHERE emp_name REGEXP 'Ki$';
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00001  | Suzuki   | HR    |   28 |
| 00003  | Kizaki   | SALES |   35 |
| 00005  | Kizaki   | DEV   |   55 |
+--------+----------+-------+------+
3 rows in set (0.00 sec)

.:任意の1文字に一致する

mysql> SELECT * FROM tab1 WHERE emp_name REGEXP '.n';
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00002  | Tanaka   | SALES |   25 |
| 00004  | Tanaka   | DEV   |   45 |
+--------+----------+-------+------+
2 rows in set (0.00 sec)

*:直前の文字の 0 回以上の繰り返しに一致する

mysql> SELECT 'TST' REGEXP 'TE*ST';
+----------------------+
| 'TST' REGEXP 'TE*ST' |
+----------------------+
|                    1 |
+----------------------+
1 row in set (0.00 sec)

mysql> SELECT 'TEST' REGEXP 'TE*ST';
+-----------------------+
| 'TEST' REGEXP 'TE*ST' |
+-----------------------+
|                     1 |
+-----------------------+
1 row in set (0.00 sec)

mysql> SELECT 'TEEST' REGEXP 'TE*ST';
+------------------------+
| 'TEEST' REGEXP 'TE*ST' |
+------------------------+
|                      1 |
+------------------------+
1 row in set (0.00 sec)

+:直前の文字の 1 回以上の繰り返しに一致する

mysql> SELECT 'TST' REGEXP 'TE+ST';
+----------------------+
| 'TST' REGEXP 'TE+ST' |
+----------------------+
|                    0 |
+----------------------+
1 row in set (0.00 sec)

mysql> SELECT 'TEST' REGEXP 'TE+ST';
+-----------------------+
| 'TEST' REGEXP 'TE+ST' |
+-----------------------+
|                     1 |
+-----------------------+
1 row in set (0.00 sec)

mysql> SELECT 'TEEST' REGEXP 'TE+ST';
+------------------------+
| 'TEEST' REGEXP 'TE+ST' |
+------------------------+
|                      1 |
+------------------------+
1 row in set (0.00 sec)

?:直前の文字の 0 回か 1 回に一致する

mysql> SELECT 'TST' REGEXP 'TE?ST';
+----------------------+
| 'TST' REGEXP 'TE?ST' |
+----------------------+
|                    1 |
+----------------------+
1 row in set (0.00 sec)

mysql> SELECT 'TEST' REGEXP 'TE?ST';
+-----------------------+
| 'TEST' REGEXP 'TE?ST' |
+-----------------------+
|                     1 |
+-----------------------+
1 row in set (0.00 sec)

mysql> SELECT 'TEEST' REGEXP 'TE?ST';
+------------------------+
| 'TEEST' REGEXP 'TE?ST' |
+------------------------+
|                      0 |
+------------------------+
1 row in set (0.00 sec)

abc|def:abcまたはdefの文字列に一致する

mysql> SELECT * FROM tab1 WHERE emp_name REGEXP 'Suzu|Kiza';
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00001  | Suzuki   | HR    |   28 |
| 00003  | Kizaki   | SALES |   35 |
| 00005  | Kizaki   | DEV   |   55 |
+--------+----------+-------+------+
3 rows in set (0.00 sec)

(abc)*:abcのゼロ個以上の繰り返しに一致する

mysql> SELECT 'TEST' REGEXP '(TEST)*';
+-------------------------+
| 'TEST' REGEXP '(TEST)*' |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT 'a' REGEXP '(TEST)*';
+----------------------+
| 'a' REGEXP '(TEST)*' |
+----------------------+
|                    1 |
+----------------------+
1 row in set (0.00 sec)

mysql> SELECT 'TESTTEST' REGEXP '(TEST)*';
+-----------------------------+
| 'TESTTEST' REGEXP '(TEST)*' |
+-----------------------------+
|                           1 |
+-----------------------------+
1 row in set (0.00 sec)

[abc]:a,b,cのいずれかの値と一致する

mysql> SELECT 'TEST' REGEXP '[TES]';
+-----------------------+
| 'TEST' REGEXP '[TES]' |
+-----------------------+
|                     1 |
+-----------------------+
1 row in set (0.00 sec)

mysql> SELECT 'TEST' REGEXP '[abc]';
+-----------------------+
| 'TEST' REGEXP '[abc]' |
+-----------------------+
|                     0 |
+-----------------------+
1 row in set (0.00 sec)

[a-c]:aからcのいずれかの値と一致する

mysql> SELECT 'TEST' REGEXP '^[a-z]';
+------------------------+
| 'TEST' REGEXP '^[a-z]' |
+------------------------+
|                      1 |
+------------------------+
1 row in set (0.00 sec)

mysql> SELECT 'TEST' REGEXP '[a-c]';
+-----------------------+
| 'TEST' REGEXP '[a-c]' |
+-----------------------+
|                     0 |
+-----------------------+
1 row in set (0.00 sec)

[^a-c]:aからc以外の値と一致する

mysql> SELECT 'TEST' REGEXP '[^a-z]';
+------------------------+
| 'TEST' REGEXP '[^a-z]' |
+------------------------+
|                      0 |
+------------------------+
1 row in set (0.00 sec)

mysql> SELECT 'TEST' REGEXP '[^a-c]';
+------------------------+
| 'TEST' REGEXP '[^a-c]' |
+------------------------+
|                      1 |
+------------------------+
1 row in set (0.00 sec)