正則表達式

適用於: SQL Server 2025(17.x)Azure SQL DatabaseAzure SQL 受控執行個體Microsoft 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 符合 s 或 t, 且 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,}? x 至少為 n 個時,以較少者為佳
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) 在 re 期間設定 <flags>;非擷取群組

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 語法和查詢的基本知識。
  • 對正則表達式語法和概念的基本瞭解。

FAQ

使用 regex 的效能影響為何?

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

局限性

目前適用以下限制:

  • 所有函式都支援 LOB 資料型別(string_expression 或 REGEXP_*),但輸入大小限制在 2 MB。
  • 原生編譯的預存程序不支援正規表示式函式。