メインコンテンツまでスキップ
バージョン: 26.x

REGEXP_EXTRACT

説明

これは、指定された文字列STRに対して正規表現マッチを実行し、指定されたパターンに適合するPOS番目のマッチング部分を抽出するために使用される関数です。関数がマッチング結果を返すためには、パターンがSTRの一部と完全に一致する必要があります。

マッチが見つからない場合、空の文字列が返されます。 文字セットマッチングを処理する際は、Utf-8標準文字クラスを使用する必要があることに注意してください。これにより、関数が異なる言語の様々な文字を正しく識別し処理できることが保証されます。

strパラメータは'string'型で、正規表現マッチングの対象となる文字列を表します。 patternパラメータは'string'型で、対象となる正規表現パターンを表します。 posパラメータは'integer'型で、文字列内で正規表現マッチの検索を開始する位置を指定するために使用されます。位置は1から始まり、このパラメータは必須です。

patternが許可されていない正規表現の場合、エラーをスローします;

サポートされる文字マッチクラス : https://github.com/google/re2/wiki/Syntax

構文

REGEXP_EXTRACT(<str>, <pattern>, <pos>)

パラメータ

Parameterデスクリプション
<str>正規表現マッチングを実行する対象のカラムです。'string' 型です。
<pattern>対象となる正規表現パターンです。'string' 型です。
<pos>文字列内で正規表現マッチングの検索を開始する位置を指定するために使用されるパラメータです。文字列内の文字位置を表す整数値です(1から開始)。pos は必須で指定する必要があります。

Return Value

パターンのマッチング部分です。Varchar 型です。マッチするものが見つからない場合は、空の文字列が返されます。

Example

最初にマッチした部分を抽出します。この例では、正規表現 ([[:lower:]]+)C([[:lower:]]+) は、1つ以上の小文字に続いて 'C'、そして1つ以上の小文字が続く文字列の部分にマッチします。'C' の前の最初のキャプチャグループ ([[:lower:]]+) は 'b' にマッチするため、結果は 'b' になります。

mysql> SELECT regexp_extract('AbCdE', '([[:lower:]]+)C([[:lower:]]+)', 1);
+-------------------------------------------------------------+
| regexp_extract('AbCdE', '([[:lower:]]+)C([[:lower:]]+)', 1) |
+-------------------------------------------------------------+
| b |
+-------------------------------------------------------------+

2番目にマッチした部分を抽出します。ここでは、'C'の後の2番目のキャプチャグループ([[:lower:]]+)が'd'にマッチするため、結果は'd'になります。

mysql> SELECT regexp_extract('AbCdE', '([[:lower:]]+)C([[:lower:]]+)', 2);
+-------------------------------------------------------------+
| regexp_extract('AbCdE', '([[:lower:]]+)C([[:lower:]]+)', 2) |
+-------------------------------------------------------------+
| d |
+-------------------------------------------------------------+

中国語文字をマッチします。パターン (\p{Han}+)(.+) は、最初に1つ以上の中国語文字 (\p{Han}+) をマッチし、次に文字列の残りの部分 ((.+)) をマッチします。2番目のキャプチャグループは文字列の非中国語部分をマッチするため、結果は 'This is a passage in English 1234567' となります。

mysql> select regexp_extract('这是一段中文 This is a passage in English 1234567', '(\\p{Han}+)(.+)', 2);
+-----------------------------------------------------------------------------------------------+
| regexp_extract('这是一段中文 This is a passage in English 1234567', '(\p{Han}+)(.+)', 2) |
+-----------------------------------------------------------------------------------------------+
| This is a passage in English 1234567 |
+-----------------------------------------------------------------------------------------------+

変数値を挿入してマッチングを実行します。この例では、Tableにデータを挿入し、その後REGEXP_EXTRACT関数を使用して、保存されたパターンと位置に基づいて保存された文字列からマッチング部分を抽出します。


CREATE TABLE test_table_for_regexp_extract (
id INT,
text_data VARCHAR(500),
pattern VARCHAR(100),
pos INT
) PROPERTIES ("replication_num"="1");

INSERT INTO test_table_for_regexp_extract VALUES
(1, 'AbCdE', '([[:lower:]]+)C([[:lower:]]+)', 1),
(2, 'AbCdE', '([[:lower:]]+)C([[:lower:]]+)', 2),
(3, '这是一段中文 This is a passage in English 1234567', '(\\p{Han}+)(.+)', 2);

SELECT id, regexp_extract(text_data, pattern, pos) as extract_result FROM test_table_for_regexp_extract ORDER BY id;

+------+----------------+
| id | extract_result |
+------+----------------+
| 1 | b |
| 2 | d |
| 3 | This is a passage in English 1234567 |
+------+----------------+

パターンにマッチしないテストを行います。パターン([[:digit:]]+)(1つ以上の数字)は文字列'AbCdE'のどの部分ともマッチしないため、空の文字列が返されます。

SELECT regexp_extract('AbCdE', '([[:digit:]]+)', 1);
+------------------------------------------------+
| regexp_extract('AbCdE', '([[:digit:]]+)', 1) |
+------------------------------------------------+
| |
+------------------------------------------------+

絵文字テストケース

SELECT regexp_extract('Text 😊 More 😀', '😊|😀',0);

+------------------------------------------------------+
| regexp_extract('Text 😊 More 😀', '😊|😀',0) |
+------------------------------------------------------+
| 😊 |
+------------------------------------------------------+

'str'がNULLの場合、NULLを返す

mysql> SELECT REGEXP_EXTRACT(NULL, '([a-z]+)', 1);
+-------------------------------------+
| REGEXP_EXTRACT(NULL, '([a-z]+)', 1) |
+-------------------------------------+
| NULL |
+-------------------------------------+

'pattern'がNULLの場合、NULLを返す

mysql> SELECT REGEXP_EXTRACT('Hello World', NULL, 1);
+----------------------------------------+
| REGEXP_EXTRACT('Hello World', NULL, 1) |
+----------------------------------------+
| NULL |
+----------------------------------------+

'pos'がNULLの場合、NULLを返す

mysql> SELECT REGEXP_EXTRACT('Hello World', '([a-z]+)', NULL);
+-------------------------------------------------+
| REGEXP_EXTRACT('Hello World', '([a-z]+)', NULL) |
+-------------------------------------------------+
| NULL |
+-------------------------------------------------+

全てのパラメータがNULLの場合、NULLを返す

mysql> SELECT REGEXP_EXTRACT(NULL, NULL, NULL);
+----------------------------------+
| REGEXP_EXTRACT(NULL, NULL, NULL) |
+----------------------------------+
| NULL |
+----------------------------------+

patternが正規表現として許可されていない場合、エラーをスローする。

SELECT regexp_extract('AbCdE', '([[:digit:]]+', 1);
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.2)[INVALID_ARGUMENT]Could not compile regexp pattern: ([[:digit:]]+
Error: missing ): ([[:digit:]]+