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

REGEXP_EXTRACT_OR_NULL

説明

テキスト文字列から対象の正規表現パターンにマッチする最初の部分文字列を抽出し、式グループインデックスに基づいてそこから特定のグループを抽出します。

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

備考

Apache Doris 3.0.2以降でサポート

'pattern'が許可されたregexp正規でない場合、エラーを投げます

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

構文

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

パラメータ

Parameterデスクリプション
<str>文字列パラメータ。正規表現マッチングが実行される対象のテキスト文字列を表します。この文字列は任意の文字の組み合わせを含むことができ、関数はにマッチする部分文字列をその中から検索します。
<pattern>文字列パラメータ。対象となる正規表現パターンです。このパターンには様々な正規表現メタ文字や文字クラスを含めることができ、マッチさせる部分文字列のルールを正確に定義します。
<pos>整数パラメータ。抽出する式グループのインデックスを示します。インデックスは1から開始します。が0に設定されている場合、最初にマッチした部分文字列全体が返されます。が負の数またはパターン内の式グループ数を超えている場合、関数はNULLを返します。

Return Value

文字列型を返し、結果は<pattern>にマッチした部分になります。

入力<pos>が0の場合、最初にマッチした部分文字列全体を返します。 入力<pos>が無効(負の数または式グループ数を超えている)の場合、NULLを返します。 正規表現がマッチに失敗した場合、NULLを返します。 <pos> < 0の場合、NULLを返します。 pos > <str>の長さの場合、NULLを返します。

Example

マッチから特定のグループを抽出します。説明: 正規表現([[:lower:]]+)C([[:lower:]]+)は、'C'で区切られた1つ以上の小文字の連続を検索します。インデックス1のグループは最初の小文字の連続に対応するため、'b'が返されます。

SELECT REGEXP_EXTRACT_OR_NULL('123AbCdExCx', '([[:lower:]]+)C([[:lower:]]+)', 1);
+---------------------------------------------------------------------------+
| REGEXP_EXTRACT_OR_NULL('123AbCdExCx', '([[:lower:]]+)C([[:lower:]]+)', 1) |
+---------------------------------------------------------------------------+
| b |
+---------------------------------------------------------------------------+

マッチした部分文字列全体を返します。が0の場合、パターンにマッチする最初の部分文字列全体が返されます。

SELECT REGEXP_EXTRACT_OR_NULL('123AbCdExCx', '([[:lower:]]+)C([[:lower:]]+)', 0);
+---------------------------------------------------------------------------+
| REGEXP_EXTRACT_OR_NULL('123AbCdExCx', '([[:lower:]]+)C([[:lower:]]+)', 0) |
+---------------------------------------------------------------------------+
| bCd |
+---------------------------------------------------------------------------+

無効なグループインデックスです。パターンには2つのグループしかないため、インデックス5は範囲外となり、NULLが返されます。

SELECT REGEXP_EXTRACT_OR_NULL('123AbCdExCx', '([[:lower:]]+)C([[:lower:]]+)', 5);
+---------------------------------------------------------------------------+
| REGEXP_EXTRACT_OR_NULL('123AbCdExCx', '([[:lower:]]+)C([[:lower:]]+)', 5) |
+---------------------------------------------------------------------------+
| NULL |
+---------------------------------------------------------------------------+

一致しない正規表現です。文字列 'AbCdE' のどの部分もパターンに完全に一致しません。

SELECT REGEXP_EXTRACT_OR_NULL('AbCdE', '([[:lower:]]+)C([[:upper:]]+)', 1);
+---------------------------------------------------------------------+
| REGEXP_EXTRACT_OR_NULL('AbCdE', '([[:lower:]]+)C([[:upper:]]+)', 1) |
+---------------------------------------------------------------------+
| NULL |
+---------------------------------------------------------------------+

中国語文字のマッチング。パターン(\p{Han}+)(.+)は、最初に1つ以上の中国語文字にマッチし、次に残りの任意の文字にマッチします。インデックス2のグループは、中国語文字の後の文字列の非中国語部分を表します。

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

Tableへのデータ挿入と抽出の実行


CREATE TABLE test_regexp_extract_or_null (
id INT,
text_column VARCHAR(255),
pattern_column VARCHAR(255),
position_column INT
) PROPERTIES ("replication_num"="1");

INSERT INTO test_regexp_extract_or_null VALUES
(1, 'abc123def', '([a-z]+)([0-9]+)([a-z]+)', 2),
(2, 'Hello World', '([A-Z][a-z]+) ([A-Z][a-z]+)', 0),
(3, '123-456-789', '([0-9]{3})-([0-9]{3})-([0-9]{3})', 3),
(4, 'example@example.com', '([a-z]+)@([a-z]+)\\.([a-z]+)', 1),
(5, '测试文本 test text', '(\\p{Han}+) (.+)', 1);

SELECT id, REGEXP_EXTRACT_OR_NULL(text_column, pattern_column, position_column) AS extracted_result
FROM test_regexp_extract_or_null
ORDER BY id;

+------+-----------------+
| id | extracted_result|
+------+-----------------+
| 1 | 123 |
| 2 | Hello World |
| 3 | 789 |
| 4 | example |
| 5 | 测试文本 |
+------+-----------------+

Emoji ケース

SELECT regexp_extract_or_null('😀😊😎', '😀|😊|😎',0);
+------------------------------------------------------------+
| regexp_extract_or_null('😀😊😎', '😀|😊|😎',0) |
+------------------------------------------------------------+
| 😀 |
+------------------------------------------------------------+

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

SELECT REGEXP_EXTRACT_OR_NULL(NULL, '([a-z]+)', 1);
+---------------------------------------------+
| REGEXP_EXTRACT_OR_NULL(NULL, '([a-z]+)', 1) |
+---------------------------------------------+
| NULL |
+---------------------------------------------+

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

SELECT REGEXP_EXTRACT_OR_NULL('Hello World', NULL, 1);
+------------------------------------------------+
| REGEXP_EXTRACT_OR_NULL('Hello World', NULL, 1) |
+------------------------------------------------+
| NULL |
+------------------------------------------------+

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

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

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

SELECT REGEXP_EXTRACT_OR_NULL(NULL,NULL,NULL);
+----------------------------------------+
| REGEXP_EXTRACT_OR_NULL(NULL,NULL,NULL) |
+----------------------------------------+
| NULL |
+----------------------------------------+

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

mysql> SELECT REGEXP_EXTRACT_OR_NULL('123AbCdExCx', '([[:lower:]]+)C([[]ower:]]+)', 1);
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.2)[INVALID_ARGUMENT]Could not compile regexp pattern: ([[:lower:]]+)C([[:lower:]+)
Error: missing ]: [[:lower:]+)