SelectDB Enterprise
参考手册
SQL 函数
标量函数
字符串函数
REGEXP_EXTRACT

REGEXP_EXTRACT

<<<<<<< HEAD

3ce78af1b (squash commit)

描述

此函数用于对给定字符串 STR 执行正则匹配,并提取符合指定模式的第 POS 个匹配部分。若函数要返回匹配结果,该模式必须与 STR 的某些部分完全匹配。

若未找到匹配项,将返回空字符串。 需要注意的是,在处理字符集匹配时,应使用 Utf-8 标准字符类。这确保函数能够正确识别和处理来自不同语言的各种字符。

str参数为'string' 类型,表示要进行正则匹配的字符串。 pattern参数为'string' 类型,表示目标正则表达式模式。 pos参数为 'integer' 类型,用于指定字符串中开始搜索正则表达式匹配的位置。位置从 1 开始,此参数必须指定。

如果 'pattern' 参数不符合正则表达式,则抛出错误

支持的字符匹配种类 : https://github.com/google/re2/wiki/Syntax (opens in a new tab)

语法

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

参数

参数描述
<str>需要进行正则匹配的列,类型为'string'。
<pattern>目标正则表达式模式,类型为'string'。
<pos>用于指定字符串中开始搜索正则表达式匹配位置的参数,为整数值,表示字符串中的字符位置(从 1 开始)。pos必须指定。

返回值

模式的匹配部分,类型为 Varchar。若未找到匹配项,将返回空字符串

示例

提取第一个匹配部分,在此示例中,正则表达式([[:lower:]]+)C([[:lower:]]+)匹配字符串中一个或多个小写字母后跟 'C' 再跟一个或多个小写字母的部分。'C' 之前的第一个捕获组([[:lower:]]+)匹配 'b',因此结果为 'b'

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

提取第二个匹配部分,这里,'C' 之后的第二个捕获组([[:lower:]]+)匹配 'd',因此结果为 'd'。

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

匹配中文字符,模式(\p{Han}+)(.+)首先匹配一个或多个中文字符(\p{Han}+),然后匹配字符串的剩余部分((.+))。第二个捕获组匹配字符串的非中文部分,因此结果为 '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                                                          |
+-----------------------------------------------------------------------------------------------+

插入变量值并执行匹配,此示例向表中插入数据,然后使用 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:]]+)(一个或多个数字)与字符串 'AbCdE' 的任何部分都不匹配,因此返回空字符串

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

emoji字符匹配

SELECT regexp_extract('Text 😊 More 😀', '😊|😀',0);
 
+------------------------------------------------------+
| regexp_extract('Text 😊 More 😀', '😊|😀',0)                 |
+------------------------------------------------------+
| 😊                                                     |
+------------------------------------------------------+
1 row in set (0.02 sec)

'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:]]+
© 2025 北京飞轮数据科技有限公司 京ICP备2022004029号 | Apache、Apache Doris 以及相关开源项目名称均为 Apache 基金会商标