正規表現の検索
使用MySQLの正規表現
基本的な文字の一致
次の文は、テキスト列のすべての行が1000をPROD_NAME取得します。
エントリー
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'
ORDER BY prod_name;
輸出
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
+--------------+
分析
キーワードLIKE REGEXPを交換することが、この文は非常にLIKE文のように見えます。プロセス(1000年一致正規表現のテキストが含まれるテキストを照合)正規表現としての事を言われた後、REGEXP:それはMySQLを伝えます。
上記の例では、正規表現は、多くの利点(5月も劣化パフォーマンスを)持っていませんが、次の例を考えてみてください。
エントリー
SELECT prod_name
FROM products
WHERE prod_name REGEXP '.000'
ORDER BY prod_name;
輸出
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
分析
これは、**、正規表現を使用しています。000。** .
正規表現言語は特殊文字です。これは、任意の1つの文字に一致することを意味します。
もちろん、この特定の例では、LIKEとワイルドカードを完了するために使用することができます。
一致大文字と小文字を区別しない MySQLの正規表現マッチング(バージョン3.23.4以降)には、大文字と小文字が区別されない(すなわち、大文字と小文字が一致)。大文字と小文字を区別は、WHERE PROD_NAME REGEXP BINARY「Jetpackの0.000」として、BINARYキーワードを使用することができます 。
OR試合
二つの文字列(または文字列の、文字列または他)の1、使用を検索|
、次のように、:
エントリー
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;
輸出
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
分析
2000 |声明では、正規表現1000年を使用しています。|
陽性の発現OR演算子。それはそれらのいずれかと一致を意味します。
OR 2つ以上の条件は、二つ以上のOR条件を与えてもよいです。例えば、 '1000 | 3000 | 2000' 1000または2000または3000が一致します。
いくつかの文字のいずれかと一致
任意の1文字に一致します。使用のセットを指定すること[
と]
、次のように、囲まれた文字を完了するために:
エントリー
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123] Ton'
ORDER BY prod_name;
輸出
+-------------+
| prod_name |
+-------------+
| 1 ton anvil |
| 2 ton anvil |
+-------------+
分析
[123]は、文字の集合を定義することは、1又は2又は3マッチングを意味します。
図から分かるように、[]それはOR文の別の形です。実際には、正規表現の[123]トン[1 | 2 | 3]トンの略称は、後者を使用してもよいです。しかし、どのようなORステートメントの発見を定義する] [使用する必要があります。これをよりよく理解するために、次の例を考えてみます。
エントリー
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1|2|3 Ton'
ORDER BY prod_name;
輸出
+---------------+
| prod_name |
+---------------+
| 1 ton anvil |
| 2 ton anvil |
| JetPack 1000 |
| JetPack 2000 |
| TNT (1 stick) |
+---------------+
分析
これは、所望の出力ではありません。これは、2つの行が検索される必要があり、また、追加の3行が取り出さ。MySQLはあなたが「1」または「2」または「3トン」を意味想定しているため、この理由はあります。文字がない限り|
、コレクションに含まれ、またはそれはシリーズ全体に適用されます。
文字セットもあり、彼らは指定された文字以外のものと一致することを、否定することができます。配置のコレクションの先頭に負の文字セット、^
缶を。このように、ものの[123]は、文字1、2または3と一致しますが、[^123]
彼らは文字のほかには何も一致します。
レンジマッチング
照合するための1つのまたは複数の文字の集合を定義するために使用されます。例えば、0〜9のマッチング番号の設定以下:
[0123456789]
このタイプのコレクションを簡単にするために使用することができる-
範囲を定義します。次の式は、デジタルリストと機能的に同じです。
[0-9]
範囲は、完全なセットに限定されるものではありません。また、必ずしも値の範囲だけ、[AZ]は、任意のアルファベット文字と一致します。
例として:
エントリー
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[1-5] Ton'
ORDER BY prod_name;
輸出
+--------------+
| prod_name |
+--------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
+--------------+
分析
本明細書で使用される、正規表現[1-5]トンなど。[1-5]定義された範囲は、マッチ1-5の式は、流れは、三本のマッチングラインを返します。5トン以来マッチが返されます。5トンを。
特殊文字をマッチング
エントリー
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP '.'
ORDER BY vend_name;
輸出
+----------------+
| vend_name |
+----------------+
| ACME |
| Anvils R Us |
| Furball Inc. |
| Jet Set |
| Jouets Et Ours |
| LT Supplies |
+----------------+
分析
これは、所望の出力されない.
任意の文字にマッチするので、それぞれの行が取得されます。
特殊文字を一致させるには、それがなければなりません\\
プリアンブルのために。\\-
ルックアップは-
、\\.
検索を意味します.
。
エントリー
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP '\\.'
ORDER BY vend_name;
輸出
+--------------+
| vend_name |
+--------------+
| Furball Inc. |
+--------------+
分析
これは、所望の出力です。\\.
試合は.
、これだけ一つの行が取得しました。このプロセスのすべての文字は、いわゆるエスケープ(エスケープ)で、正規表現は、このようにエスケープする必要があります内の特別な意味を持っています。
\\
また、メタ文字(文字は特別な意味を持っている)を参照するために使用される、以下のとおりです。
メタキャラクタ | 説明 |
---|---|
\\ F | フィード |
\\ n個 | ラップ |
\\ R | 入ります |
\\トン | 集計 |
\\ V | 垂直タブ |
\マッチングバックスラッシュと一致するためには
\
、文字自体を、あなたが使用する必要があります\\\
。
\または\\?ほとんどの正規表現の実装では、これらの文字自体を使用するためには、単一のバックスラッシュのエスケープ特殊文字を使用しています。しかし、MySQLは2つのバックスラッシュ(別を説明するための正規表現ライブラリのMySQLの自分の解釈)が必要です。
マッチング文字クラス
これは、文字クラス(文字クラス)と呼ばれる文字の定義済みのセット、との作業に便利です。次の表は、文字クラスとその意味。
カテゴリ | 説明 |
---|---|
[:すくい] | 任意の文字と数字([-ZA-Z0-9]付) |
[:アルファ:] | ([-ZA-Z]を有する)任意の文字 |
[:ブランク:] | 空白やタブ([\ T]を有します) |
[:CNTRL:] | ASCII制御文字(31と127 ASCII 0) |
[:桁:] | ([0-9]を有する)任意の数の |
[:グラフ:] | そして[:印刷:]同じですが、スペースが含まれていません。 |
[下部:] | ([AZ]を有する)任意の小文字 |
[:印刷:] | 任意の印刷可能な文字 |
【ポイント:] | どちらも[:alnum:]ないで[:CNTRL:]任意の文字ではありません |
[:スペース:] | スペース([\\ F \\ N \\ R \\ T \\ V]を有する)を含む任意の空白文字 |
[:Unnper:] | 任意の大文字(と[AZ]) |
[:XDIGIT] | ([-FA-F0-9]を有する)任意の16進数字 |
マッチングの複数の例
繰り返しメタ文字
メタキャラクタ | 説明 |
---|---|
* | ゼロまたはそれ以上の一致 |
+ | 一つまたは複数のマッチ({1}に等しいです) |
? | 0又は1マッチ({0,1}に等しいです) |
{N} | マッチの指定された数 |
{N} | マッチの指定された数より少ないです |
{N、M} | マッチング範囲の数(M 255) |
エントリー
SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\([0-9] sticks?\\)'
ORDER BY prod_name;
輸出
+----------------+
| prod_name |
+----------------+
| TNT (1 stick) |
| TNT (5 sticks) |
+----------------+
分析
\\(
マッチ(
、[0-9](それは任意の文字に一致する前に?0または1が表示されているので、その代わりにS?の後)任意の数、スティック?マッチングとスティックスティックに合わせて、\\)
一致)
。
エントリー
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[[:digit:]]{4}'
ORDER BY prod_name;
輸出
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
分析
[:桁:]が設定された数であるので、任意の数と一致します。{4}マッチング任意の4桁の番号にリンク{4}正確にその請求項の文字(任意の数):桁] []になるように、4回発生します。
次のように上記の例では、書くことができます。
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[0-9][0-9][0-9][0-9]'
ORDER BY prod_name;
ロケータ
テキストの特定の場所を照合するには、次の表では、必要なロケータを示しています。
メタキャラクタ | 説明 |
---|---|
^ | テキストの先頭 |
$ | テキストの終わり |
[[:<:] | 単語の先頭 |
[[:>:]] | 語尾 |
エントリー
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;
輸出
+--------------+
| prod_name |
+--------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
+--------------+
分析
^
文字列の先頭にマッチします。したがって、^[0-9\\.]
唯一の.
彼らが一致したときに、最初の文字列または任意の数。
^デュアル使用の2つの方法で^。(【と】定義により)コレクションに、そうでなければ、負のを設定するためにそれを使用して、文字列の先頭にを指すために使用。
LIKE REGEXPに似た作用するので文字列全体がREGEXP LIKEの一致するサブストリングを照合しながら、という点以外LIKEとREGEXP。それぞれの式^で開始することにより、ロケータを使用して、それぞれの表現で$エンドは、REGEXPとLIKEとして機能することができます。
単純な正規表現のテストでは、データベース・テーブルを使用せずにSELECT正規表現をテストするために使用することができます。REGEXPを確認し、常に0(一致なし)または1(試合)を返し、テスト式に文字列REGEXPを使用し、それらに対応する構文について試験することができる次のとおりです。
SELECT 'hello' REGEXP '[0-9]';
この例では明らかに0を返します。