快速入門
教學
工具和語言
範例
參考
書籍評論
正規表示式工具
grep
PowerGREP
RegexBuddy
RegexMagic
一般應用程式
EditPad Lite
EditPad Pro
語言和函式庫
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQuery 和 XPath
XRegExp
資料庫
MySQL
Oracle
PostgreSQL
本網站的更多資訊
簡介
正則表示式快速入門
正則表示式教學
替換字串教學
應用程式和語言
正則表示式範例
正則表示式參考
替換字串參考
書籍評論
可列印 PDF
關於本網站
RSS Feed 和部落格
RegexBuddy—The best regex editor and tester for PostgreSQL developers!

PostgreSQL 有三種正則表示式風格

PostgreSQL 7.4 和更新版本使用 Henry Spencer 為 Tcl 8.2 開發的完全相同的正則表示式引擎。這表示 PostgreSQL 支援相同的三種正則表示式風格:Tcl 進階正則表示式POSIX 延伸正則表示式POSIX 基本正則表示式。就像在 Tcl 中一樣,ARE 是預設值。我對 Tcl 的正則表示式風格的所有評論,例如不尋常的模式修改符號和字詞邊界標記,完全適用於 PostgreSQL。如果您不熟悉 Tcl 的 ARE,您絕對應該檢閱它們。不過,遺憾的是,PostgreSQL 的 regexp_replace 函數並未對替換文字使用與 Tcl 的 regsub 指令相同的語法。

7.4 之前的 PostgreSQL 版本僅支援 POSIX 延伸正則表示式。如果您要將舊的資料庫程式碼移轉到新版本的 PostgreSQL,您可以將 PostgreSQL 的「regex_flavor」執行時間參數設定為「extended」,而不是預設的「advanced」,以使 ERE 成為預設值。

PostgreSQL 也支援傳統的 SQL LIKE 運算子,以及 SQL:1999 SIMILAR TO 運算子。這些使用它們自己的模式語言,本文未討論這些語言。ARE 強大許多,而且如果您不使用 LIKE 或 SIMILAR TO 未提供的功能,它們並不會更複雜。

波浪號運算子

波浪號中綴運算子會傳回 true 或 false,具體取決於正則表示式是否可以比對字串的一部分。例如,'subject' ~ 'regexp' 傳回 false,而 'subject' ~ '\\w' 傳回 true。如果正規表示式必須比對整個字串,您需要使用 錨點。例如,'subject' ~ '^\\w$' 傳回 false,而 'subject' ~ '^\\w+$' 傳回 true。此運算子有 4 種變化

雖然只有區分大小寫可以由運算子切換,但所有其他選項都可以在正規表示式的開頭使用 模式修改器 來設定。模式修改器會覆寫運算子類型。例如,‘(?c)regex’ 強制 regex 區分大小寫。

此運算子最常見的用法是根據欄位是否符合正規表示式來選取列,例如

select * from mytable where mycolumn ~* 'regexp'

正規表示式作為 PostgreSQL 文字字串

反斜線用於跳脫 PostgreSQL 字串中的字元。因此,包含反斜線的正規表示式,例如 \w,在寫成 PostgreSQL 陳述式中的文字字串時會變成 '\\w'。若要比對單一文字反斜線,您需要正規表示式 \\,在 PostgreSQL 中會變成 '\\\\'

PostgreSQL Regexp 函數

使用 substring(字串 from 樣式) 函數,您可以擷取字串或欄位的部分。它需要兩個參數:您要從中擷取文字的字串,以及擷取的文字應符合的樣式。如果沒有比對,substring() 會傳回 null。例如,substring('subject' from 'regexp') 會傳回 null。如果存在比對,且正規表示式有一個或多個 擷取群組,則會傳回與第一個擷取群組比對的文字。例如,substring('subject' from 's(\\w)') 會傳回 ‘u’。如果存在比對,但正規表示式沒有擷取群組,則會傳回整個正規表示式比對。例如,substring('subject' from 's\\w') 會傳回 ‘su’。如果正規表示式與字串比對多次,則只會傳回第一個比對。由於 substring() 函數不採用「旗標」參數,因此您需要使用 模式修改器 來切換任何比對選項。

此函數特別適用於從欄位中擷取資訊。例如,若要為每個列從欄位 mycolumn 中擷取第一個數字,請使用

select substring(mycolumn from '\d+') from mytable

使用 regexp_replace(主旨, 樣式, 替換 [, 旗標]),您可以在字串中替換正規表示式比對。如果您省略旗標參數,則正規表示式會區分大小寫地套用,且只會替換第一個比對。如果您將旗標設定為 'i',則正規表示式會不區分大小寫地套用。'g' 旗標(代表「全域」)會導致正規表示式在字串中的所有比對都被替換。您可以將兩個旗標合併為 'gi'

您可以在替換文字中使用反向參照 \1\9,將與擷取群組比對的文字重新插入正規表示式中。 \& 會重新插入整個正規表示式比對。請記得在文字字串中加倍反斜線。

例如:regexp_replace('subject', '(\w)\w', '\&\1', 'g') 會傳回 'susbjbecet'

PostgreSQL 8.3 及更新版本有兩個新函式,可用來沿著正規表示式比對來分割字串。regexp_split_to_table(subject, pattern[, flags]) 會將分割的字串傳回為一個新表格。regexp_split_to_array(subject, pattern[, flags]) 會將分割的字串傳回為一個文字陣列。如果正規表示式找不到任何比對,這兩個函式都會傳回主旨字串。

| 快速入門 | 教學 | 工具與語言 | 範例 | 參考 | 書籍評論 |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML Schema | Xojo | XQuery & XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |