Oracle Database 10g 引入正規表達式功能,提供 REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、REGEXP_REPLACE 四大函數/運算子,大幅強化字串模式比對、擷取、取代能力,超越傳統 LIKE、INSTR、SUBSTR、REPLACE 的限制。
| 類別 | 元字符 | 說明 |
|---|---|---|
| 定位 | ^ | 行首 |
$ | 行尾 | |
| 量詞 | * | 0 次或多次 |
? | 0 次或 1 次 | |
+ | 1 次或多次 | |
{m} | 恰好 m 次 | |
{m,} | 至少 m 次 | |
{m,n} | m 到 n 次 | |
| POSIX 字元類 | [:alpha:] | 字母 |
[:digit:] | 數字 | |
[:alnum:] | 英數字元 | |
[:lower:] | 小寫字母 | |
[:upper:] | 大寫字母 | |
[:space:] | 空白字元 | |
[:punct:] | 標點符號 | |
[:print:] | 可列印字元 | |
| 替換/分組 | | | 或 |
() | 子表達式分組(可供後向參考) | |
[...] | 字元清單 |
-- 找出 ZIP 欄位含非數字字元的列
SELECT zip FROM zipcode
WHERE REGEXP_LIKE(zip, '[^[:digit:]]');
-- 取得郵遞區號(行尾 5 碼數字)起始位置
SELECT REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph, CA 91234', '[[:digit:]]{5}$')
FROM dual; -- 回傳 45
-- 支援選擇性 4 碼擴充碼
SELECT REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph, CA 91234-1234', '[[:digit:]]{5}(-[[:digit:]]{4})?$')
FROM dual; -- 回傳 44
-- 擷取逗號分隔欄位中的第二欄
SELECT REGEXP_SUBSTR('first field, second field , third field', '[^,]*,')
FROM dual; -- 回傳 ', second field ,'
-- 將多個連續空白取代為單一空白
SELECT REGEXP_REPLACE('Joe Smith', '( ){2,}', ' ')
FROM dual; -- 回傳 'Joe Smith'
-- 後向參考:姓名格式轉換 'Ellen Hildi Smith' → 'Smith, Ellen Hildi'
SELECT REGEXP_REPLACE('Ellen Hildi Smith', '(.*) (.*) (.*)', '\3, \1 \2')
FROM dual; -- 回傳 'Smith, Ellen Hildi'
-- 偵測重複單字
SELECT REGEXP_SUBSTR('The final test is is the implementation', '([[:alnum:]]+)([[:space:]]+)\1')
FROM dual; -- 回傳 'is is'
所有函數支援選用 match_parameter:
'i':不區分大小寫'c':區分大小寫(預設)'n':讓 . 比對換行符'm':多行模式,^/$ 比對每行首尾'x':忽略模式中的空白註解ALTER TABLE students ADD CONSTRAINT chk_ssn
CHECK (REGEXP_LIKE(ssn, '^([[:digit:]]{3}-[[:digit:]]{2}-[[:digit:]]{4}|[[:digit:]]{9})$'));
接受 123-45-6789 或 123456789 格式。
CREATE OR REPLACE TRIGGER trg_clean_phone
BEFORE INSERT OR UPDATE ON customers
FOR EACH ROW
BEGIN
:NEW.phone := REGEXP_REPLACE(:NEW.phone, '[^[:digit:]]', '');
END;
SELECT REGEXP_SUBSTR(line, '[^|]+', 1, LEVEL) AS field
FROM import_table
CONNECT BY REGEXP_SUBSTR(line, '[^|]+', 1, LEVEL) IS NOT NULL;
LIKE 或 SUBSTR 過濾候選集。正規表達式是處理非結構化文字資料的利器。掌握元字符、量詞、字元類、分組與後向參考,即可解決傳統 SQL 函數難以處理的複雜模式比對、擷取、取代需求。建議將常用模式封裝為 PL/SQL 函數庫,提升團隊開發效率與一致性。