正規表現を使ったパターンマッチングを行う(REGEXP演算子)
WHERE 句で条件を指定するときに REGEXP 演算子を使用すると、カラムの値と文字列が一致するかどうかを比較する時にを正規表現を使ったパターンマッチングを行うことができます。ここでは MySQL で REGEXP 演算子を使ってカラムの値をパターンマッチングする方法について解説します。
※ 正規表現とは何かについては「正規表現入門」を参照されてください。
(Last modified: )
正規表現を使ったパターンマッチングを行う
WHERE 句で条件を指定する場合に、 REGEXP 演算子を使用することでカラムの値に対して正規表現を使ったパターンマッチングを行うことができます。使い方は次の通りです。
SELECT col_name1 [, col_name2 ...] FROM table_name WHERE col_name REGEXP pattern
パターンは( pattern )は正規表現を使って記述します。カラムの値のいずれかの部分がパターンとマッチした場合に条件式は TRUE となります。
使用できる正規表現は次の通りです。
. 任意の1文字に一致します。 [...] 括弧内のいずれかの文字に一致 [abc] なら a b c のいずれかに一致 [a-z] なら a から z のいずれかに一致 [^a-z] なら a から z 以外に一致 * 直前の文字の 0 回以上の繰り返しに一致 + 直前の文字の 1 回以上の繰り返しに一致 ? 直前の文字の 0 回か 1 回に一致 ab|cd|ef ab または cd または ef の文字列に一致 ^ 文字列の先頭に一致 $ 文字列の末尾に一致 (abc) 例えば (abc)* のように使用 {n,m} {n} 直前のパターンの n 回連続に一致 {n,} 直前のパターンの n 回以上の連続に一致 {,m} 直前のパターンの m 回以下の連続に一致 {n,m} 直前のパターンの n回以上 m 回以下の連続に一致
サンプルを使いながら使い方を確認していきます。
-- --
テスト用に次ようなテーブルを作成しました。
create table regexptest(str varchar(10));
テスト用のデータを追加しながら正規表現を使ったパターンマッチングを試していきます。
文字列の先頭と末尾
^ と記述すると文字列の先頭と一致し、 $ と記述すると文字列の末尾と一致します。
テーブルに次のようなデータが格納されていたとします。
先頭が 'Y' から始まる値を一致させるには次のように実行します。
select * from regexptest where str regexp '^Y';
同じように先頭が 'Ya' から始まる値を一致させるには次のように実行します。
select * from regexptest where str regexp '^Ya';
今度は末尾が 'da' で終わる値を一致させるには次のように実行します。
select * from regexptest where str regexp 'da$';
文字の繰り返し
* は直前の文字の 0 回以上の繰り返し、 + は直前の文字の 1 回以上の繰り返し、 ? は直前の文字の 0 回または 1回と一致します。
テーブルに次のようなデータが格納されていたとします。
G で始まり O が 0 回以上繰り返した後に G が続く値に一致させるには次のように実行します。
select * from regexptest where str regexp 'GO*G';
G で始まり O が 1 回以上繰り返した後に G が続く値に一致させるには次のように実行します。
select * from regexptest where str regexp 'GO+G';
G で始まり O が 0 回か 1 回繰り返した後に G が続く値に一致させるには次のように実行します。
select * from regexptest where str regexp 'GO?G';
文字列のいずれかに一致
ab | cd | ef は ab または cd または ef のいずれかと一致します。
テーブルに次のようなデータが格納されていたとします。
'Red' 'Yellow' 'White' のいずれかが含まれる値に一致させるには次のように実行します。
select * from regexptest where str regexp 'Red|Yellow|White';
正規表現を使ったパターンマッチングのついていくつか試してみました。
BINARY演算子を使って大文字と小文字を区別する
REGEXP 演算子を使ったパターンマッチングを行う場合、大文字と小文字の区別はされません。大文字と小文字を区別してパターンマッチングするには BINARY 演算子を指定します。
SELECT col_name1 [, col_name2 ...] FROM table_name WHERE col_name REGEXP BINARY pattern
では実際に試してみます。先ほど使用したテーブルに次のようなデータが入っていたとします。
先頭の文字が 'a' から 'z' までの文字で始まる値を一致させるために次のように実行してみます。
select * from regexptest where str regexp '^[a-z]';
大文字と小文字の区別がされないため a から z だけではなく A から Z で始まる値とも一致してしまっています。
大文字と小文字を区別するためには BINARY 演算子を付けて次のように実行してください。
select * from regexptest where str regexp binary '^[a-z]';
今度は小文字の a から z で始まる値だけが一致しています。
-- --
REGEXP 演算子を使ってカラムの値をパターンマッチングする方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。