Oracle 8/9i 僅支援簡單的 LIKE 模式匹配,Oracle 10g 終內建符合 POSIX 標準的正則表達式,提供四大核心函數,語法與傳統字串函數對應:
| 正則函數 | 傳統對應 | 說明 |
|---|---|---|
REGEXP_LIKE | LIKE | 條件判斷,回傳 TRUE/FALSE |
REGEXP_INSTR | INSTR | 回傳匹配子串起始位置 |
REGEXP_SUBSTR | SUBSTR | 回傳匹配子串內容 |
REGEXP_REPLACE | REPLACE | 替換匹配子串並回傳新字串 |
^ 字串開頭 / $ 字串結尾. 任意單一字元[a-z] 字元範圍 ≡ [[:lower:]]? 0 或 1 次 / + 1 次以上 / * 0 次以上{m,n} m~n 次 / {m} 剛好 m 次 / {m,} 至少 m 次(...) 分組 / | 替代 (OR)範例:'^([a-z]+|[0-9]+)$' 僅匹配全小寫字母或全數字字串。
-- 大小寫不敏感匹配以 JA 或 JO 開頭的員工
WHERE REGEXP_LIKE(ename, '^J[AO]', 'i')
-- CHECK 約束:ename 僅允許字母數字 (無空格標點)
ALTER TABLE emp ADD CONSTRAINT regex01
CHECK (REGEXP_LIKE(ename, '^[[:alnum:]]+$'));
違反約束拋出 ORA-02290。
-- 找出第一個 $金額 位置
SELECT REGEXP_INSTR('The total is $400 for your purchase.', '\$[[:digit:]]+')
FROM dual; -- 回傳 14
-- 進階參數:出現次數、搜尋起始位、回傳匹配後位置
-- 逗號分隔值取第一欄
SELECT REGEXP_SUBSTR('one,two,three', '[^,]*') FROM dual; -- 'one'
-- 華氏轉攝氏
SELECT REGEXP_REPLACE('The temperature is 23°F',
'([[:digit:]]+)°F',
'(\1-32)*5/9||''°C''')
FROM dual; -- 'The temperature is -5°C'
注意替換字串中 \1 代表第一個捕獲群組,需在 SQL 字串中雙重轉義。
CHECK 條件與函數索引加速查詢。正則表達式功能強大但較傳統函數耗費 CPU。大量資料處理時,建議:
LIKE/INSTR 完成可行案例。CREATE INDEX idx_emp_name_regex ON emp (REGEXP_SUBSTR(ename, '^[A-Z]+'));