共用方式為


正則表達式

適用於: SQL Server 2025(17.x)Azure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric 中的 SQL 資料庫

本文介紹 SQL Server 的正規表示式。

正則表達式或 regex 是定義文字搜尋模式的字元序列。 Regex 通常用於各種工作,包括模式比對、數據驗證、數據轉換和查詢。 它提供彈性且有效率的方式來搜尋、作及處理複雜的數據作業。

Note

規則運算式可在 Azure SQL 受控執行個體中使用 SQL Server 2025始終保持最新更新政策

正則表達式的這個實作是以 RE2 正則表示式連結庫為基礎。 如需詳細資訊,請流覽 RE2 正則表示式語法

支援的正則運算式函數:

Function Description
REGEXP_LIKE 會傳回布爾值,指出文字輸入是否符合 regex 模式。
REGEXP_REPLACE 傳回由取代字串所取代的修改來源字串,其中找到 regex 模式。
REGEXP_SUBSTR 根據正則表達式模式擷取字串的部分。

傳回第 N 個符合 regex 模式的子字串。
REGEXP_INSTR 根據所提供的選項,傳回相符子字串的開始或結束位置。
REGEXP_COUNT 傳回字串中發生 regex 模式的次數計數。
REGEXP_MATCHES 傳回符合正則表示式模式與字串的擷取子字串數據表。 如果找不到相符專案,則函式不會傳回任何數據列。
REGEXP_SPLIT_TO_TABLE 傳回以 regex 模式分隔的字串分割數據表。 如果模式不相符,函式會傳回字串。

正規表示式可以由文字字元和元字元組成,它們具有特殊的意義和功能。

基本正規表示式是單一文字字元。 字元會比對自己,但元字元除外。 中繼字元包括 *、 、 +?()、 或 |。 若要比對元字元,請使用反斜線轉義它。 例如,\* 匹配星號符號 * 字元。

兩個正則運算式可以變更或連結,以形成新的正則運算式:如果 e1 符合 s ,且 e2 符合 t,則 e1 | e2 符合 st且 e1e2 符合 st

元字元 *+? 是重複運算子: e1* 比對零個或多個 (可能不同) 字串的序列,每個字串都與 e1 相符;e1 + 比對一個或多個字串; e1? 匹配零或一個。

運算子優先順序 (從最弱繫結到最強繫結) 如下所示: - 交替 - 串連 - 重複運算子

明確的括號可用於強制不同的含義,例如在算術表達式中。 一些範例: ab|cd 相當於 ;(ab)|(cd)相當於 aba(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
$ 在文字結尾 (like \z、 not \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

使用 regex 的效能影響為何?

正則表示式查詢可能會受到效能影響,這取決於正則表示式模式的複雜度、文字數據的大小,以及所涉及的資料行數目。 您可以使用執行計劃和統計數據來監視和優化 regex 查詢的效能。

局限性

以下項目目前不支援:

  • 下列內建函式支援 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
  • 原生編譯的預存程序不支援正規表示式函式。