正则表达式

适用于: SQL Server 2025 (17.x) Azure SQL 数据库Azure SQL 托管实例Microsoft Fabric 中的 SQL 分析终结点和 Microsoft Fabric 中的仓库Microsoft Fabric 中的 SQL 数据库

本文介绍 SQL Server 的正则表达式。

正则表达式(或简称regex)是一种定义文本搜索模式的字符序列。 各种不同的任务(包括模式匹配、数据验证、数据转换和查询)通常都会用到正则表达式。 它提供了一种灵活且高效的方法来搜索、操作和处理复杂的数据操作。

正则表达式的此实现基于 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} 恰好 n 个 x
x*? 零个或多个 x,尽量少一些为佳
x+? 一个或多个 x,数量以少为宜
x?? 零或一 x,首选零
x{n,m}? n 或 n+1 或 ... 或 m x,优先选择较少的
x{n,}? n 个或更多 x,优先更少
x{n}? 恰好 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 客户端工具,例如 SQL Server Management Studio 或 Visual Studio Code。
  • SQL 语法和查询的基础知识。
  • 基本了解正则表达式语法和概念。

平台支持

  • 在Azure SQL 托管实例中,T-SQL正则表达式函数仅通过SQL Server 2025或Always-up-to-date更新策略提供。
  • T-SQL 正则表达式函数可在 Azure SQL 数据库、Fabric 中的 SQL 数据库中使用,并从 SQL Server 2025 开始提供。
  • T-SQL 正则表达式函数在 SQL Server 2022 及更早版本中不可用。
  • T-SQL 正则表达式标量函数作为预览功能在Fabric Data Warehouse中提供。 更多信息请参见Fabric Data Warehouse中的正规表达式函数。 T-SQL的正则表达式表值函数在Fabric Data Warehouse中不可用。

FAQ

使用正则表达式对性能有何影响?

正则表达式查询可能会产生性能影响,具体取决于正则表达式模式的复杂性、文本数据的大小以及所涉及的行数。 可以使用执行计划和统计信息来监视和优化正则表达式查询的性能。

局限性

当前存在以下限制:

  • 用于的 LOB 数据类型(varchar(max) 或 string_expression)在所有REGEXP_*函数中均受支持,但输入大小限制为 2 MB。
  • 本机编译的存储过程不支持正则表达式函数。