【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)