适用于:
Databricks SQL
Databricks Runtime
正则表达式(正则表达式)是描述一组字符串的模式。 多个Azure Databricks SQL 函数和运算符采用正则表达式来匹配、定位、计数、提取、替换或拆分文本:
- rlike 运算符和 regexp 运算符:测试字符串是否与模式匹配。
- regexp_like 函数:测试字符串是否与模式匹配。
- regexp_count 函数:计算模式匹配次数。
- regexp_instr 函数:返回第一个匹配的位置。
- regexp_substr 函数:返回第一个匹配的子字符串。
- regexp_extract 和 regexp_extract_all 函数:从第一个匹配项或所有匹配项返回捕获组。
- regexp_replace 函数:将匹配项替换为替换字符串。
- split 函数:围绕模式的匹配项拆分字符串。
like 和 ilike 运算符不使用正则表达式。 它们使用基于和%的更简单的模式语言_。
正则表达式引擎
Azure Databricks使用 Java java.util.regex 引擎计算正则表达式。
模式必须遵循Java正则表达式语法,该语法与 Perl 样式正则表达式广泛兼容,但在某些细节上有所不同。
有关完整的权威参考,请参阅JavaPattern类文档。
以下部分介绍最常用的构造。
字符类
| 构造 | Matches |
|---|---|
. |
除行终止符之外的任何单个字符(除非 s 设置了标志)。 |
[abc] |
列出的任意字符之一: a、 b或 c。 |
[^abc] |
任何 不是a、 b或 c的单个字符。 |
[a-z] |
范围az中的任何字符。 |
\d、\D |
数字 ([0-9]); \D 匹配任何非数字。 |
\w、\W |
单词字符 ([a-zA-Z_0-9]); \W 匹配任何非单词字符。 |
\s、\S |
空格字符; \S 匹配任何非空格字符。 |
定位点和边界
| 构造 | Matches |
|---|---|
^ |
输入的开头(或带有标志的行)。m |
$ |
输入的末尾(或带有标志的行的 m 末尾)。 |
\b、\B |
单词边界; \B 匹配非单词边界。 |
数量词
限定符指定上述元素必须匹配的次数。
默认情况下,限定符是 贪婪 和尽可能匹配。 追加 ? 以使限定符 不情愿 (尽可能少匹配),例如 .*?。
| 构造 | 匹配前面的元素... |
|---|---|
* |
零次或多次。 |
+ |
一次或多次。 |
? |
零次或一次。 |
{n} |
正好 n 是时间。 |
{n,} |
n至少一次。 |
{n,m} |
间隔 n 和 m 时间。 |
组和交替
| 构造 | Description |
|---|---|
(...) |
捕获组。 将组索引用于 regexp_extract。 |
(?:...) |
非捕获组。 不捕获匹配项的组。 |
a\|b |
交替。 匹配或 ab. |
内联标志
将标志置于模式的开头,以更改整个模式的匹配方式。
| Flag | Effect |
|---|---|
(?i) |
不区分大小写的匹配。 |
(?s) |
Dotall 模式。
. 匹配行终止符。 |
(?m) |
多行模式。
^ 并在 $ 换行符处匹配。 |
(?x) |
批注模式。 忽略模式中的未转义空格。 |
例如, (?i)ste(v\|ph)en 匹配 Steven项, steven无论 STEPHEN 大小写如何。
转义和字符串文本
若要匹配也是正则表达式元字符(例如.,、*、([或\)的字符,请在其前面加上反斜杠。
例如, \. 匹配文本句点,并 \\ 匹配文本反斜杠。
由于反斜杠也是普通 SQL 字符串文本中的转义字符,因此必须将要传递给正则表达式引擎的每个反斜杠加倍。
例如,若要将模式 \d+ 传递给函数,请将其 '\\d+' 写入常规字符串文本中。
若要避免这种双重转义,请使用禁用raw-literal转义字符预处理的(r前缀)。
在原始文本中,编写模式与正则表达式引擎预期完全相同:
-- Regular string literal: backslashes must be doubled.
> SELECT regexp_substr('item 42 in stock', '\\d+');
42
-- Raw literal: write the pattern as-is.
> SELECT regexp_substr('item 42 in stock', r'\d+');
42
常见模式
以下模式涵盖频繁的任务。 它们被编写为 原始文本 ,以便反斜杠传递到正则表达式引擎不变。 电子邮件、URL 和 IP 模式是有意简单的插图,而不是严格的验证程序。
| 目标 | Pattern |
|---|---|
| 整数,可选带符号 | r'-?\d+' |
| 十进制数 | r'-?\d+(\.\d+)?' |
| 一个单词 | r'\w+' |
仅整个单词cat |
r'\bcat\b' |
| 电子邮件地址(简单) | r'[\w.%+-]+@[\w.-]+\.\w{2,}' |
| URL 中的主机 | r'https?://([^/]+)' |
| IPv4 地址(不检查 0-255) | r'\d{1,3}(\.\d{1,3}){3}' |
ISO 日期 (YYYY-MM-DD) |
r'\d{4}-\d{2}-\d{2}' |
| 前导空格或尾随空格 | r'^\s+\|\s+$' |
| 美国电话号码(简单) | r'\d{3}-\d{3}-\d{4}' |
Word边界(\b)匹配整个word而不是子字符串:
-- 'cat' as a standalone word
> SELECT 'the cat sat on the mat' rlike r'\bcat\b';
true
-- 'cat' only as part of a larger word
> SELECT 'category' rlike r'\bcat\b';
false
将文本前缀与限定符合并以提取结构化令牌,例如订单 ID:
> SELECT regexp_substr('Ref: ORD-12345 shipped on 2024-03-15', r'ORD-\d+');
ORD-12345
选择正确的函数
使用此表选取与目标匹配的函数。
| 你想要... | 使用 |
|---|---|
| 测试字符串是否匹配。 | rlike / Regexp / regexp_like |
| 返回第一个匹配的子字符串。 | regexp_substr |
| 返回捕获组。 | regexp_extract |
| 返回所有匹配项。 | regexp_extract_all |
| 返回匹配的位置。 | regexp_instr |
| 对匹配项数进行计数。 | regexp_count |
| 将匹配项替换为其他文本。 | regexp_replace |
| 在匹配项周围拆分字符串。 | split |
匹配简单的 _ / % 模式。 |
喜欢 / ilike |