通过


regexp_extract 函数

适用于:勾选“是” Databricks SQL 勾选“是” Databricks Runtime

提取与 str 表达式匹配且对应于 regexp 组索引的 regex 中的第一个字符串。

语法

regexp_extract(str, regexp [, idx] )

参数

  • str:匹配的 STRING 表达式。
  • regexp:具有匹配模式的 STRING 表达式。
  • idx:大于或等于 0 的可选整数表达式,默认值为 1。

返回

一个 STRING

如果strregexpidxNULL结果。NULL 如果 regexp 不匹配任何部分 str,则结果为空字符串。 如果总体模式匹配,但指定的 idx 组未参与匹配,则结果为空字符串。

regexp 字符串必须是Java正则表达式。 有关支持的语法,请参阅 Java 正则表达式模式

使用文本时,请使用raw-literalr 前缀)来避免转义字符预处理。

regexp 可以包含多个组。 捕获组通过将模式的一部分括在括号 (...)中来定义。 idx 指示要提取哪个正则表达式组。 idx 为 0 则表示匹配整个正则表达式。 默认值 idx 为 1,表示省略时 idx 返回第一个捕获组。

如果 idx 大于在中 regexp定义的捕获组数,Databricks 将引发错误。

仅考虑第一个 regexp 匹配 str 项。 若要提取所有匹配项,请使用 regexp_extract_all

常见错误条件

示例

提取特定捕获组

> SELECT regexp_extract('100-200', '(\\d+)-(\\d+)', 1);
 100

> SELECT regexp_extract('100-200', '(\\d+)-(\\d+)', 2);
 200

使用 idx 0 返回整个匹配项

> SELECT regexp_extract('Order: 100-200', '(\\d+)-(\\d+)', 0);
 100-200

默认 idx 为 1

省略时 idx ,将返回第一个捕获组。

> SELECT regexp_extract('abc123def', '([a-z]+)(\\d+)');
 abc

无匹配项返回空字符串

> SELECT regexp_extract('hello world', '(\\d+)', 1);

NULL 输入返回 NULL

> SELECT regexp_extract(NULL, '(\\d+)', 1);
 NULL

使用原始字符串文本避免双重转义

在常规 SQL 字符串中,反斜杠必须加倍(\\d 表示 \d)。 r使用原始字符串文本的前缀更自然地写入模式。

> SELECT regexp_extract('abc123', r'(\d+)', 1);
 123

从 URL 中提取域

> SELECT regexp_extract('https://www.databricks.com/product', r'https?://([^/]+)', 1);
 www.databricks.com

从日期字符串中提取组件

> SELECT regexp_extract('Event on 2024-03-15', r'(\d{4})-(\d{2})-(\d{2})', 0);
 2024-03-15

> SELECT regexp_extract('Event on 2024-03-15', r'(\d{4})-(\d{2})-(\d{2})', 2);
 03

不参与匹配的可选捕获组

当组是可选的且不匹配时,将返回该组的空字符串。

> SELECT regexp_extract('ac', r'(a)(b)?(c)', 2);

无效的正则表达式模式

> SELECT regexp_extract('abc', '[invalid', 0);
  Error: INVALID_PARAMETER_VALUE.PATTERN