參考連結:
PostgreSQL 模式比對www.yiibai.com
1. like
string LIKE pattern [ESCAPE escape-character]
string NOT LIKE pattern [ESCAPE escape-character]
比較特别的地方:
在pattern裡的下劃線 (_)代表(比對)任何單個字元; 而一個百分号(%)比對任何零或更多個字元的序列。
LIKE模式比對總是覆寫整個串。是以,要比對在串内任何位置的序列,該模式必須以百分号
開頭和結尾。
要比對文本的下劃線或者百分号,而不是比對其它字元, 在pattern裡相應的字元必須 前導逃
逸字元。預設的逃逸字元是反斜線,但是你可以用ESCAPE子句指定一個不同的逃逸字元。
要比對逃逸字元本身,寫兩個逃逸字元。
請注意反斜線在串文本裡已經有特殊含義了,是以如果你寫一個 包含反斜線的模式常量,那
你就要在 SQL 語句裡寫兩個反斜線。 是以,寫一個比對單個反斜線的模式實際上要在語句
裡寫四個反斜線。 你可以通過用 ESCAPE 選擇一個不同的逃逸字元 來避免這樣;這樣反斜
線就不再是 LIKE 的特殊字元了。 但仍然是字元文本分析器的特殊字元,是以你還是需要兩
個反斜線。) 我們也可以通過寫ESCAPE ''的方式不選擇逃逸字元,這樣可以有效地禁用逃逸
機制,但是沒有辦法關閉下劃線和百分号在模式中的特殊含義。
關鍵字ILIKE可以用于替換LIKE, 它令該比對根據活動區域成為大小寫無關。這個不屬于
SQL标準而是一個PostgreSQL擴充
操作符~~等效于LIKE, 而~~*對應ILIKE。 還有 !~~和!~~*操作符分别代表NOT LIKE和NOT
ILIKE。所有這些操作符都是PostgreSQL特有的。
2. SIMILAR TO正規表達式
string SIMILAR TO pattern [ESCAPE escape-character]
string NOT SIMILAR TO pattern [ESCAPE escape-character]
它和LIKE非常類似,隻不過它使用 SQL 标準定義的正規表達式了解模式。 SQL 正規表達式是在LIKE标記和普通的正規表達式标記的奇怪的雜交。
類似LIKE,SIMILAR TO操作符隻有在它的模式比對整個串的時候才能成功;這一點和普通
的 正規表達式的行為不同,在普通的正規表達式裡,模式比對串的任意部分
SIMILAR TO使用_和%作為分别代表任意單個字元和任意串的通配符(這些可以比得上 POSIX 正規表達式裡的.和.*)
除了這些從LIKE借用的功能之外,SIMILAR TO支援下面這些從 POSIX 正規表達式借用的 模
式比對元字元:
• |表示選擇(兩個候選之一)。
• *表示重複前面的項零次或更多次。
• +表示重複前面的項一次或更多次。
• ?表示重複前面的項零次或一次。
• {m}表示重複前面的項剛好m次。
• {m,}表示重複前面的項m次或更多次。
• {m,n}表示重複前面的項至少m次并且不超過n次。
• 可以使用圓括号()把多個項組合成一個邏輯項。
• 一個方括号表達式[...]聲明一個字元類,就像 POSIX 正規表達式一樣。
注意點号(.)不是SIMILAR TO的一個元字元。
和LIKE一樣,反斜線禁用所有這些元字元的特殊含義;當然我們也可以用ESCAPE指定一個
不同的逃逸字元。
帶三個參數的substring,即substring(string from pattern for escape-character),提供了抽取一個比對 SQL 正規表達式的子串的方法。
和SIMILAR TO一樣,聲明的模式必須比對整個資料函數和操作符串,否則函數失敗并傳回空值。
為了辨別在成功的時候應該傳回的模式部分,模式 必須
包含逃逸字元的兩次出現,并且後面要跟上雙引号(")。
比對這兩個标記之間的模式的文本将被傳回。
substring('foobar' from '%#"o_b#"%' for '#') oob
substring('foobar' from '#"o_b#"%' for '#') NULL
3.POSIX正規表達式
正規表達式比對操作符

,除非該正規表達式顯式地挂接在串的開頭或者結尾;
帶兩個參數的substring函數,即substring(string from pattern),提供了抽取一個比對POSIX 正規表達式模式的子串的方法。如果沒有比對它傳回空值,否則就是文本中比對模式的那部分。
但是如果該模式包含任何圓括号,那麼将傳回比對第一對子表達式(對應第一個左圓括号的) 的文本。
如果你想在表達式裡使用圓括号而又不想導緻這個例外,那麼你可以在整個表達式外邊放上一對圓括号。 如果你需要在想抽取的子表達式前有圓括号,參閱後文描述的非捕獲性圓括号。
一些例子:
substring('foobar' from 'o.b') oob
substring('foobar' from 'o(.)b') o
regexp_replace函數 提供了将比對 POSIX 正規表達式模式的子串替換為新文本的功能。
文法格式:regexp_replace(source, pattern, replacement [, flags ])
如果沒有比對pattern,那麼傳回不加修改的source串;
replacement串可以包含n, 其中n是 1 到 9, 表明源串裡比對模式裡第n個圓括号子表
達式的子串應該被插入;
并且它可以包含&表示應該插入比對整個模式的子串;
如果你需要
放一個文字形式的反斜線在替換文本裡,那麼寫;
regexp_match 函數傳回從POSIX正規表達式模式
首次比對到字元串後捕獲的子字元串的文本
數組;
文法是regexp_match(string, pattern [, flags ])
如果沒有比對,結果是NULL。如果找到比對, 并且pattern不包含括起來的子表達式, 那麼結果是包含比對整個模式的子串的單元素文本數組;
如果找到比對,并且pattern包含帶括号的子表達式, 那麼結果是一個文本數組,其中的第n個元素是比對 pattern的括号括起來的第n 個子表達式的子字元串(不包括“非捕獲”括号;詳見下文);
flags參數是一個可選的文本字元串, 包含零個或多個單字母标志,用于更改函數的行為;
regexp_matches函數傳回一組捕獲的字元串的文本數組, 該字元串是通過将POSIX正則表達
式模式比對到字元串而得到的;
文法是regexp_matches(string, pattern [, flags ])
果沒有比對, 則此函數不傳回任何行,如果有一個比對且沒有給出g标志,則傳回一行;
如果有N個比對,并給出g标志,則傳回N行。
每個傳回的行都是一個文本數組,它包含整個比對的子字元串或比對 pattern的括号子表達式的子字元串,就像上面針對 regexp_match所描述的一樣。
regexp_split_to_table把一個 POSIX 正規表達式模式當作一個定界符來分離一個串。
regexp_split_to_table(string, pattern [, flags ])
regexp_split_to_array函數的行為和regexp_split_to_table相同,不過regexp_split_to_array會把它的結果以一個text數組的形式傳回。它的文法是regexp_split_to_array(string, pattern [, flags ])。這些參數和regexp_split_to_table的相同。
ELECT foo FROM
regexp_split_to_table('the quick brown fox jumps over the lazy dog', E's+')
AS foo;
foo
-------
the
quick
brown
fox
jumps
over
the
lazy
dog
(9 rows)
SELECT regexp_split_to_array('the quick brown fox jumps over the lazy dog', E's+');
regexp_split_to_array
-----------------------------------------------
{the,quick,brown,fox,jumps,over,the,lazy,dog}
(1 row)
SELECT foo FROM regexp_split_to_table('the quick brown fox', E's*') AS foo;
foo
-----
t
h
e
q
u
i
c
k
b
r
o
w
n
f
o
x
[sS]*?表示比對任意字元,且隻比對一次,即懶惰比對;
如果是[sS]*沒有帶?号,也表示比對任意字元,但允許比對任意次,即貪婪比對。
4. 正規表達式細節
注意:一個量詞不能緊跟在另外一個量詞後面,例如**是非法的。量詞不能作為表達式或者子表達式的開頭,也不能跟在^或者|後面。
5.方括号表達式
方括号表達式是一個包圍在[]中的字元清單;
如果清單以^開頭,它比對任意單個不在該清單參與部分中的字元;
想在清單中包含文本],可以讓它做清單的首字元(如果使用了^,需要放在其後);
想在清單中包含文本-,可以讓它做清單的首字元或者尾字元,或者一個範圍的第二個端點;
想在清單中把文本-當做範圍的起點, 把它用[.和.]包圍起來,這樣它就成為一個排序元素(見下文;