正则表达式预览

适用于:SQL Server 2025(17.x) 预览版Azure SQL 数据库Azure SQL 托管实例Microsoft Fabric 预览版中的 SQL 数据库

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

Note

作为预览版功能,本文中介绍的技术受制于 Microsoft Azure 预览版补充使用条款

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

Note

正则表达式在具有 SQL Server 2025Always-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 匹配 se2 匹配 t,则 e1 | 匹配 st,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_LIKE
    • REGEXP_COUNT
    • REGEXP_INSTR

但是,此支持仅限于最大 2 MB 的输入大小。

  • 以下正则表达式函数不支持 LOB 数据类型:
    • REGEXP_REPLACE
    • REGEXP_SUBSTR
    • REGEXP_MATCHES
    • REGEXP_SPLIT_TO_TABLE
  • 本机编译的存储过程不支持正则表达式函数。