MySQLのREGEXPで行末をオプションとして一致させる方法
MySQLのREGEXP演算子を使うと、正規表現によるパターンマッチングが可能です。本記事では、特定の文字列の後に続く「数字」または「行末」を柔軟に一致させる方法を解説します。例えば、「EMPLOYEE:100」の直後に別の数字が続くレコードは除外し、スペースや行末が続くレコードだけを抽出するケースを想定します。
サンプルテーブルの作成
まず、テーブルを作成します。
mysql> create table DemoTable(EmployeeCode varchar(100)); Query OK, 0 rows affected (0.56 sec)
レコードの挿入
INSERTコマンドを使って、いくつかのレコードを挿入します。
mysql> insert into DemoTable values('EMPLOYEE:100 John Smith');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('EMPLOYEE:16537 Chris Brown');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('EMPLOYEE:100 David Miller');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('EMPLOYEE:100 23432 David Miller');
Query OK, 1 row affected (0.20 sec)テーブルの内容を確認
SELECT文ですべてのレコードを表示します。
mysql> select *from DemoTable;
以下のような出力が得られます。
+---------------------------------+ | EmployeeCode | +---------------------------------+ | EMPLOYEE:100 John Smith | | EMPLOYEE:16537 Chris Brown | | EMPLOYEE:100 David Miller | | EMPLOYEE:100 23432 David Miller | +---------------------------------+ 4 rows in set (0.00 sec)
REGEXPで行末をオプションとして一致させるクエリ
ここで問題になるのは、「EMPLOYEE:100」の直後に「23432」のような別の数字が続くレコード(例:「EMPLOYEE:100 23432 David Miller」)の扱いです。単純に「EMPLOYEE:100」で検索すると、「EMPLOYEE:1002」のように100がより大きな数値の一部になっているレコードまで誤ってマッチしてしまいます。
これを防ぐには、次のように「数字以外の文字」または「行末」のいずれかに一致するパターンを指定します。
mysql> select *from DemoTable where EmployeeCode REGEXP "EMPLOYEE:100([^0-9]|$)";
この正規表現のポイントは以下のとおりです。
- [^0-9]:0〜9以外の任意の1文字(スペースや英字など)に一致します。
- $:文字列の終端(行末)に一致します。
- |:OR条件を表し、「数字以外の文字」または「行末」のどちらかに一致すればマッチとみなします。
実行結果は以下のとおりです。
+---------------------------------+ | EmployeeCode | +---------------------------------+ | EMPLOYEE:100 John Smith | | EMPLOYEE:100 David Miller | | EMPLOYEE:100 23432 David Miller | +---------------------------------+ 3 rows in set (0.00 sec)
このように、「EMPLOYEE:16537 Chris Brown」は「100」という完全な数値として含まれていないため除外され、意図した3件のレコードのみが抽出されました。「EMPLOYEE:100 23432 David Miller」は、100の後にスペース(数字以外)が続くためマッチ対象となっています。
まとめ
REGEXPで部分一致を行う際は、意図しないレコードまでマッチしてしまう可能性があります。「[^0-9]|$」のようなパターンを組み合わせることで、後続の文字が数字である場合を排除し、正確な検索結果を得ることができます。IDやコード番号など、数値の境界を厳密に判定したい場面でぜひ活用してください。
-
Javaを使ってMySQLテーブルにレコードを挿入する方法
はじめに本記事では、JavaのJDBC(Java Database Connectivity)を使用して、MySQLデータベースのテーブルにレコードを挿入する手順を解説します。まずテーブルを作成し、その後Javaプログラムからデータを登録するまでの一連の流れを見ていきましょう。1. MySQLでテーブルを作成するまず、データを挿入するためのテーブルを作成します。以下はMySQLでテーブルを作成するクエリです。mysql> create table DemoTable( Id int, Name varchar(30),&
-
Javaの正規表現(RegEx)で文字列・行の末尾に一致させる方法
正規表現におけるメタ文字「$」は、特定の文字列の末尾に一致します。つまり、文字列(または行)の最後の文字が指定したパターンと一致するかどうかを判定できます。式「\\d$」…… 数字で終わる文字列・行に一致します。式「[a-z]$」…… 小文字のアルファベットで終わる文字列・行に一致します。例1:英数字以外の文字で終わる文字列の判定次の例では、ユーザーから入力された文字列が、英数字以外の記号で終わっているかどうかを判定します。import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Patte