傳統 LIKE、INSTR、SUBSTR、REPLACE 處理複雜文本模式(電話、郵遞區號、Email、HTML 標籤、日期格式)時,寫法冗長且易出錯。Oracle 10g 引入 POSIX 相容的正規表達式函數,提供聲明式模式匹配能力。
| 函數/操作符 | 用途 | 對應傳統函數 |
|---|---|---|
REGEXP_LIKE |
WHERE 子句模式比對 | LIKE |
REGEXP_INSTR |
搜尋模式出現位置 | INSTR |
REGEXP_SUBSTR |
擷取符合模式的子字串 | SUBSTR |
REGEXP_REPLACE |
以模式替換字串 | REPLACE |
| 元字符 | 含義 | 範例 |
|---|---|---|
. |
任意單一字元(換行除外) | a.b 匹配 axb、aab |
^ |
行首定位 | ^abc 以 abc 開頭 |
$ |
行尾定位 | abc$ 以 abc 結尾 |
* |
前一元素 0 次或多次 | ab*c 匹配 ac、abc、abbc |
+ |
前一元素 1 次或多次 | ab+c 至少一個 b |
? |
前一元素 0 次或 1 次 | ab?c 匹配 ac 或 abc |
{m,n} |
前一元素 m~n 次 | \d{3,5} 3-5 位數字 |
[...] |
字元類別 | [aeiou] 元音字母 |
[^...] |
排除字元類別 | [^0-9] 非數字 |
\d |
數字 [0-9] |
\d+ 一或多位數字 |
\w |
單字字元 [a-zA-Z0-9_] |
\w+ 單字 |
\s |
空白字元 | \s* 任意空白 |
SELECT email
FROM users
WHERE REGEXP_LIKE(email, '^[\w\.-]+@[\w\.-]+\.\w{2,4}$');
SELECT REGEXP_SUBSTR(phone, '\(\d{3}\)\s*\d{3}-\d{4}(?:\s*ext\.?\s*\d+)?')
FROM contacts;
SELECT REGEXP_REPLACE(content, '<[^>]+>', '')
FROM articles;
SELECT REGEXP_SUBSTR(text, '(\b\w+\b)\s+\1')
FROM documents;
CREATE INDEX idx_email_chk ON users(REGEXP_LIKE(email, '...'))(Oracle 11g+ 支援虛擬欄位索引)。LIKE 'abc%' 利用 B-tree 索引。DETERMINISTIC 函數快取。既有 LIKE、INSTR 邏輯可漸進式改寫:優先處理「驗證格式、抽取結構化欄位、清洗髒資料」三類高價值場景。