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

MySQL REGEXP句で括弧をエスケープする方法|「()」付きの特定の値だけを抽出する

MySQL REGEXP句で括弧をエスケープして特定の値を抽出する方法

MySQLのREGEXP句で正規表現を使う場合、括弧「(」と「)」はグループ化を意味する特殊文字(メタ文字)として扱われます。そのため、文字列に含まれる実際の括弧を検索したいときは、適切にエスケープする必要があります。本記事では、文字クラス「[(]」「[)]」を使って括弧をエスケープし、「()」で囲まれた値を含むレコードだけを抽出する方法を、実際のサンプルとともに解説します。

1. サンプルテーブルを作成する

まず、検索対象となるテーブルを作成します。

mysql> create table DemoTable1908
    (
    Code text
    );
Query OK, 0 rows affected (0.00 sec)

2. レコードを挿入する

insertコマンドを使用して、テーブルにいくつかのレコードを挿入します。

mysql> insert into DemoTable1908 values('MySQL(1)Database');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1908 values('MongoDB 2 Database');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1908 values('MySQL(3)Database');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1908 values('SQL Server(10)Database');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1908 values('MySQL 8 Database');
Query OK, 1 row affected (0.00 sec)

3. テーブルの全レコードを確認する

select文でテーブル内の全レコードを表示します。

mysql> select * from DemoTable1908;

実行結果は以下の通りです。

+------------------------+
| Code                   |
+------------------------+
| MySQL(1)Database       |
| MongoDB 2 Database     |
| MySQL(3)Database       |
| SQL Server(10)Database |
| MySQL 8 Database       |
+------------------------+
5 rows in set (0.00 sec)

4. REGEXP句で括弧をエスケープして抽出する

REGEXP句で括弧をエスケープし、「()」で囲まれた値を含むレコードのみを表示するクエリがこちらです。

mysql> select * from DemoTable1908 where Code regexp '^MySQL[(][0-9][)]Database';

実行結果は以下の通りです。

+------------------+
| Code             |
+------------------+
| MySQL(1)Database |
| MySQL(3)Database |
+------------------+
2 rows in set (0.00 sec)

解説:なぜ「[(]」「[)]」を使うのか

正規表現において、括弧「( )」は通常、グループ化やキャプチャを表すメタ文字です。そのまま記述すると特殊な意味として解釈されてしまうため、リテラル文字として扱うためのエスケープが必要になります。主なエスケープ方法は次の2つです。

  • バックスラッシュでエスケープする:「\(」「\)」のように記述します(MySQLの設定によっては「\\(」「\\)」と書く必要がある場合もあります)。
  • 文字クラスでエスケープする:「[(]」「[)]」のように角括弧で囲みます。文字クラス内では括弧は単なるリテラル文字として扱われるため、確実にエスケープできます。

上記のクエリでは「[(]」「[)]」という文字クラスを使うことで、括弧そのものにマッチさせています。さらに、パターン先頭の「^」で文字列の開始位置を指定し、「[0-9]」で1桁の数字にマッチさせることで、「MySQL(数字)Database」という形式のレコードだけを抽出しています。

その結果、「SQL Server(10)Database」のように先頭が「MySQL」でないレコードや、「MySQL 8 Database」のように括弧を含まないレコードは除外されます。2桁以上の数字にも対応させたい場合は、「[0-9]」を「[0-9]+」に変更するとよいでしょう。

  1. JDBCでMySQLのバックスラッシュをエスケープするには?PreparedStatementの使い方を解説

    PreparedStatementでバックスラッシュを安全にエスケープするMySQLにデータを挿入する際、バックスラッシュ(\)などの特殊文字を安全に扱うには、PreparedStatementを使用するのが最も確実な方法です。PreparedStatementはパラメータを自動的にエスケープしてくれるため、手動で「\\」のように置き換える必要がなく、SQLインジェクション対策としても有効です。まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable1904 ( ClientId int, ClientName var

  2. MySQLでIN句に指定した値のみを任意の順序で表示する方法

    MySQLでIN句に指定した値のみを任意の順序で表示する方法MySQLでは、IN()とORDER BY句、さらにFIELD()関数を組み合わせることで、IN句内に指定した値だけを、希望する独自の順序で表示できます。通常のORDER BYは昇順・降順のソートしかできませんが、FIELD()関数を使えば自由に並び順を定義できるのがポイントです。サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable1986(Number int);Query OK, 0 rows affected (0.00 sec)次に、INSERTコマ