适用于: SQL Server 2025 (17.x)
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 数据库
本文介绍 SQL Server 的正则表达式。
正则表达式(或简称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
本机编译的存储过程不支持正则表达式函数。