正規表示式函數

所有正規表示式函數都使用 Java 模式語法,但有一些值得注意的例外

  • 當使用多行模式(透過 (?m) 旗標啟用)時,只有 \n 會被識別為行終止符。此外,不支援 (?d) 旗標,且不得使用。

  • 不區分大小寫比對(透過 (?i) 旗標啟用)始終以 Unicode 感知方式執行。但是,不支援上下文敏感和本地敏感的比對。此外,不支援 (?u) 旗標,且不得使用。

  • 不支援替代對。例如,\uD800\uDC00 不會被視為 U+10000,必須指定為 \x{10000}

  • 對於沒有基本字元的非間隔符號,邊界 (\b) 的處理方式不正確。

  • 字元類別中不支援 \Q\E(例如 [A-Z123]),而是被視為字面值。

  • 支援 Unicode 字元類別 (\p{prop}),但有以下差異

    • 必須移除名稱中的所有底線。例如,使用 OldItalic 而不是 Old_Italic

    • 腳本必須直接指定,不帶 Isscript=sc= 前綴。範例:\p{Hiragana}

    • 區塊必須使用 In 前綴指定。不支援 block=blk= 前綴。範例:\p{Mongolian}

    • 類別必須直接指定,不帶 Isgeneral_category=gc= 前綴。範例:\p{L}

    • 二進位屬性必須直接指定,不帶 Is。範例:\p{NoncharacterCodePoint}

regexp_extract_all(string, pattern) -> array(varchar)

傳回 string 中正規表示式 pattern 比對的子字串。

SELECT regexp_extract_all('1a 2b 14m', '\d+'); -- [1, 2, 14]
regexp_extract_all(string, pattern, group) -> array(varchar)

string 中尋找正規表示式 pattern 的所有出現次數,並傳回 擷取群組編號 group

SELECT regexp_extract_all('1a 2b 14m', '(\d+)([a-z]+)', 2); -- ['a', 'b', 'm']
regexp_extract(string, pattern) -> varchar()

傳回 string 中正規表示式 pattern 比對的第一個子字串。

SELECT regexp_extract('1a 2b 14m', '\d+'); -- 1
regexp_extract(string, pattern, group) -> varchar()

string 中尋找正規表示式 pattern 的第一個出現次數,並傳回 擷取群組編號 group

SELECT regexp_extract('1a 2b 14m', '(\d+)([a-z]+)', 2); -- 'a'
regexp_like(string, pattern) -> boolean()

評估正規表示式 pattern,並判斷它是否包含在 string 中。

此函數類似於 LIKE 運算子,不同之處在於模式只需要包含在 string 中,而不需要比對整個 string。換句話說,此函數執行的是包含運算,而不是比對運算。您可以使用 ^$ 來錨定模式,以比對整個字串。

SELECT regexp_like('1a 2b 14m', '\d+b'); -- true
regexp_replace(string, pattern) -> varchar()

string 中移除正規表示式 pattern 比對的每個子字串執行個體。

SELECT regexp_replace('1a 2b 14m', '\d+[ab] '); -- '14m'
regexp_replace(string, pattern, replacement) -> varchar()

string 中正規表示式 pattern 比對的每個子字串執行個體替換為 replacement擷取群組可以使用編號群組的 $g 或具名群組的 ${name}replacement 中引用。美元符號 ($) 可以透過使用反斜線 (\$) 逸出來包含在替換中。

SELECT regexp_replace('1a 2b 14m', '(\d+)([ab]) ', '3c$2 '); -- '3ca 3cb 14m'
regexp_replace(string, pattern, function) -> varchar()

使用 function,替換 string 中所有與正規表達式 pattern 匹配的子字串。 對於每次匹配,將調用 lambda 運算式 function,並將捕獲群組 作為陣列傳遞。 捕獲群組編號從一開始;沒有針對整個匹配的群組(如果需要,請用括號將整個表達式括起來)。

SELECT regexp_replace('new york', '(\w)(\w*)', x -> upper(x[1]) || lower(x[2])); --'New York'
regexp_split(string, pattern) -> array(varchar)

使用正規表達式 pattern 分割 string 並返回一個陣列。 保留尾隨的空字串。

SELECT regexp_split('1a 2b 14m', '\s*[a-z]+\s*'); -- [1, 2, 14, ]