适用于:SQL Server 2025(17.x) 预览版
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 预览版中的 SQL 数据库
本文介绍 SQL Server 的正则表达式。
Note
作为预览版功能,本文中介绍的技术受制于 Microsoft Azure 预览版补充使用条款。
正则表达式(或简称regex)是一种定义文本搜索模式的字符序列。 各种不同的任务(包括模式匹配、数据验证、数据转换和查询)通常都会用到正则表达式。 它提供了一种灵活且高效的方法来搜索、操作和处理复杂的数据操作。
Note
正则表达式在具有 SQL Server 2025 或 Always-up-to-date更新策略的 Azure SQL 托管实例中可用。
正则表达式的此实现基于 RE2 正则表达式库。 有关详细信息,请访问 RE2 正则表达式语法。
支持的正则表达式函数:
| Function | Description |
|---|---|
| REGEXP_LIKE | 返回一个布尔值,指示文本输入是否与正则表达式模式匹配。 |
| REGEXP_REPLACE | 在找到正则表达式模式的位置用替换字符串替换源字符串,返回修改后的源字符串。 |
| REGEXP_SUBSTR | 根据正则表达式模式提取字符串的一部分。 返回与正则表达式模式匹配的子字符串的第 N 个匹配项。 |
| REGEXP_INSTR | 返回匹配子字符串的起始位置或结束位置,具体取决于提供的选项。 |
| REGEXP_COUNT | 返回正则表达式模式在字符串中出现的次数。 |
| REGEXP_MATCHES | 返回一个表格,其中包括与字符串的正则表达式模式匹配的已捕获子字符串。 如果找不到匹配项,该函数将不返回任何行。 |
| REGEXP_SPLIT_TO_TABLE | 返回一个表格,其中包含根据正则表达式模式分割和分隔的字符串。 如果与模式不匹配,该函数将返回字符串。 |
正则表达式可以由具有特殊含义和函数的文本字符和元字符组成。
基本正则表达式是单个文本字符。 字符与自身匹配,元字符除外。 元字符包括*、、+、?(、或)|。 若要匹配元字符,请使用反斜杠对其进行转义。 例如, \* 匹配文本星号 (*) 字符。
可以更改或连接两个正则表达式以形成新的正则表达式:如果 e1 匹配 s 和 e2 匹配 t,则 e1 | 匹配 s 或 t,e1e2 匹配 st。
元字符 *, +并且 ? 是重复运算符: e1* 匹配零个或多个(可能不同的)字符串序列,每个字符串匹配 e1;e1 + 匹配一个或多个; e1? 匹配零个或一个。
运算符优先级,从最弱到最强的绑定,如下所示: - 交替 - 串联 - 重复运算符
显式括号可用于强制不同的含义,就像在算术表达式中一样。 一些示例: ab|cd 等效于 (ab)|(cd) ; ab 等效于 a(b)。
有关 RE2 接受的正则表达式语法的详细信息,请参阅
RE2 正则表达式语法。 此页面还列出了 PCRE、Perl 和 Vim 接受的一些语法。
接受的正则表达式字符
单个字符表达式
| 单字符表达式的类型 | Examples |
|---|---|
| 任何字符,可能包括换行符 (s=true) | . |
| 字符类 | [xyz] |
| 非字符类 | [^xyz] |
| Perl 字符类 | \d |
| 非 Perl 字符类 | \D |
| ASCII 字符类 | [[:alpha:]] |
| 非 ASCII 字符类 | [[:^alpha:]] |
| Unicode 字符类(一个字母名称) | \pN |
| Unicode 字符类 | \p{Greek} |
| 非 Unicode 字符类(一个字母名称) | \PN |
| 非 Unicode 字符类 | \P{Greek} |
| 复合材料 | Description |
|---|---|
xy |
x 后跟 y |
x | y |
x 或 y (首选 x) |
| 重复 | Description |
|---|---|
x* |
零个或多个 x,首选更多 |
x+ |
一个或多个 x,首选更多 |
x? |
零个或一个 x,首选一个 |
x{n,m} |
n 或 n+1 或 ...或 m x,首选更多 |
x{n,} |
n 个或多个 x,首选更多 |
x{n} |
exactly n x |
x*? |
零个或多个 x,首选更少 |
x+? |
一个或多个 x,首选更少 |
x?? |
零或一 x,首选零 |
x{n,m}? |
n 或 n+1 或 ...或 m x,首选更少 |
x{n,}? |
n 个或多个 x,首选更少 |
x{n}? |
exactly n x |
Note
计数表单 x{n,m}, x{n,}并 x{n} 拒绝创建最小或最大重复计数超过 1,000 的表单。 无限制的重复不受此限制的约束。
Perl 字符类
下表列出了当前支持的 Perl 字符类。
| Perl 字符类(仅限于 ASCII 字符) | Description |
|---|---|
\d |
数字 ( [0-9]) |
\D |
非数字([^0-9]) |
\s |
空格 ( [\t\n\f\r ]) |
\S |
非空白字符 ( [^\t\n\f\r ]) |
\w |
单词字符 ( [0-9A-Za-z_]) |
\W |
非单词字符 ( [^0-9A-Za-z_]) |
ASCII 字符类
下表列出了当前支持的 ASCII 字符类。
| ASCII 字符类 | Description |
|---|---|
[[:alnum:]] |
字母数字 ( [0-9A-Za-z]) |
[[:alpha:]] |
按字母顺序 ( [A-Za-z]) |
[[:ascii:]] |
ASCII ([\x00-\x7F]) |
[[:blank:]] |
空白 ([\t ]) |
[[:cntrl:]] |
控制 ( [\x00-\x1F\x7F]) |
[[:digit:]] |
数字 ( [0-9]) |
[[:graph:]] |
图形 ( [!-~] 或 [A-Za-z0-9!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]) |
[[:lower:]] |
小写 ( [a-z]) |
[[:print:]] |
可打印 ( [ -~] 或 [ [:graph:]]) |
[[:punct:]] |
标点符号 ( [!-/:-@[-\``{-~]) |
[[:space:]] |
空格 ( [\t\n\v\f\r ]) |
[[:upper:]] |
大写 ( [A-Z]) |
[[:word:]] |
单词字符 ( [0-9A-Za-z_]) |
[[:xdigit:]] |
十六进制数字 ( [0-9A-Fa-f]) |
文本字符
- Letters
- Numbers
- Symbols
空字符串
| 空字符串 | Description |
|---|---|
^ |
文本或行开头 (m=true) |
$ |
文本末尾(如 \z,而不是 \Z)或行(m=true) |
\A |
文本开头 |
\b |
在 ASCII 字边界(\w 一侧和 \W, \A或 \z 另一侧) |
\B |
不在 ASCII 字边界处 |
\z |
文本结尾 |
Groupings
模式的捕获组(子表达式)包含:
| Grouping | Description |
|---|---|
(re) |
编号捕获组 (子匹配) |
(?P<name>re) |
命名和编号捕获组 (子匹配) |
(?:re) |
非捕获组 |
(?<flags>) |
在当前组中设置 <flags> ;非捕获 |
(?<flags>:re) |
在 ;非捕获分组期间<flags>设置re |
Flags
使用标志修改表达式行为。 例如:
| Flag | Description |
|---|---|
i |
不区分大小写 (默认值 false) |
m |
多行模式: ^ 和 $ 匹配开始/结束行,以及开始/结束文本(默认值 false) |
s |
让 . 匹配 \n (默认值 false) |
c |
区分大小写(默认值 true) |
此实现支持 RE2 后的正则表达式的 POSIX 标准,并支持正则表达式语法的 PCRE/PCRE2 风格,该语法与大多数新式正则表达式引擎和工具兼容。 正则表达式有不同的风格,例如 POSIX、ANSI、Perl 和 PCRE,具有不同的语法和功能。 有关基础正则表达式引擎支持的构造和行为的详细信息,请参阅 正则表达式库 RE2。
Note
SQL Server 中的正则表达式匹配无法遵循 SQL 排序规则进行语言学比较。 此行为的设计和与大多数正则表达式引擎一致,因为匹配基于模式和 Unicode 字符属性,而不是排序规则。 因此,与 LIKE 等其他字符串比较函数相比,这可能会导致行为差异,尤其是在具有特定于语言的排序规则的索引列上。
Requirements
- SQL 客户端工具,例如 Azure Data Studio、SQL Server Management Studio 或 Visual Studio Code。
- SQL 语法和查询的基础知识。
- 基本了解正则表达式语法和概念。
FAQ
使用正则表达式对性能有何影响?
正则表达式查询可能会产生性能影响,具体取决于正则表达式模式的复杂性、文本数据的大小以及所涉及的行数。 可以使用执行计划和统计信息来监视和优化正则表达式查询的性能。
已知问题、行为和限制
以下是此预览版当前不支持的项目:
- 以下内部函数支持 LOB 数据类型 (varchar(max) 或 nvarchar(max)
string_expressions:REGEXP_LIKEREGEXP_COUNTREGEXP_INSTR
但是,此支持仅限于最大 2 MB 的输入大小。
- 以下正则表达式函数不支持 LOB 数据类型:
REGEXP_REPLACEREGEXP_SUBSTRREGEXP_MATCHESREGEXP_SPLIT_TO_TABLE
- 本机编译的存储过程不支持正则表达式函数。