正则表达式

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

正则表达式(正则表达式)是描述一组字符串的模式。 多个Azure Databricks SQL 函数和运算符采用正则表达式来匹配、定位、计数、提取、替换或拆分文本:

likeilike 运算符不使用正则表达式。 它们使用基于和%的更简单的模式语言_

正则表达式引擎

Azure Databricks使用 Java java.util.regex 引擎计算正则表达式。 模式必须遵循Java正则表达式语法,该语法与 Perl 样式正则表达式广泛兼容,但在某些细节上有所不同。 有关完整的权威参考,请参阅JavaPattern类文档

以下部分介绍最常用的构造。

字符类

构造 Matches
. 除行终止符之外的任何单个字符(除非 s 设置了标志)。
[abc] 列出的任意字符之一: abc
[^abc] 任何 不是abc的单个字符。
[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} 间隔 nm 时间。

组和交替

构造 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