MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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やコード番号など、数値の境界を厳密に判定したい場面でぜひ活用してください。

  1. Javaを使ってMySQLテーブルにレコードを挿入する方法

    はじめに本記事では、JavaのJDBC(Java Database Connectivity)を使用して、MySQLデータベースのテーブルにレコードを挿入する手順を解説します。まずテーブルを作成し、その後Javaプログラムからデータを登録するまでの一連の流れを見ていきましょう。1. MySQLでテーブルを作成するまず、データを挿入するためのテーブルを作成します。以下はMySQLでテーブルを作成するクエリです。mysql> create table DemoTable(   Id int,   Name varchar(30),&

  2. Javaの正規表現(RegEx)で文字列・行の末尾に一致させる方法

    正規表現におけるメタ文字「$」は、特定の文字列の末尾に一致します。つまり、文字列(または行)の最後の文字が指定したパターンと一致するかどうかを判定できます。式「\\d$」…… 数字で終わる文字列・行に一致します。式「[a-z]$」…… 小文字のアルファベットで終わる文字列・行に一致します。例1:英数字以外の文字で終わる文字列の判定次の例では、ユーザーから入力された文字列が、英数字以外の記号で終わっているかどうかを判定します。import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Patte