Oracle 10g+ 提供四大正則函數對應傳統字串函數:REGEXP_LIKE (LIKE)、REGEXP_INSTR (INSTR)、REGEXP_SUBSTR (SUBSTR)、REGEXP_REPLACE (REPLACE),11g 新增 REGEXP_COUNT。本文系統整理呼叫格式、參數詳解、元字符/字符簇/優先級、簡單與複雜實戰案例。
REGEXP_INSTR(source_string, pattern [, position [, occurrence [, return_option [, match_parameter ]]]])
source_string:輸入字串pattern:正則運算式position:起始搜尋位置(預設 1)occurrence:第 N 次匹配(預設 1)return_option:0=匹配首字元位置,1=匹配後下一字元位置match_parameter:i忽略大小寫、c區分大小寫、n點號不匹配換行、m多行模式、x忽略運算式空白REGEXP_LIKE/REGEXP_SUBSTR/REGEXP_REPLACE/REGEXP_COUNT 參數類似,依功能微調。
| 類別 | 符號 | 說明 |
|---|---|---|
| 元字符 | ^ | 字串開頭;[] 內表示否定 |
| $ | 字串結尾;多行模式匹配 \n/\r | |
| . | 任一字元(除 \n,除非 n 參數) | |
| ? | 前面子運算式 0 或 1 次 | |
| * | 前面子運算式 0 或多次 | |
| + | 前面子運算式 1 或多次 | |
| () | 標記子運算式群組 | |
| [] | 字符簇定義 | |
| {m,n} | 出現次數範圍;{m} 剛好 m 次;{m,} 至少 m 次 | |
| | | 或邏輯 | |
| \n | 反向引用第 n 群組 | |
| \ | 轉義符 | |
| 字符簇 | [[:alpha:]] | 任意字母 |
| [[:digit:]] | 任意數字 | |
| [[:alnum:]] | 字母數字 | |
| [[:space:]] | 空白字元 | |
| [[:upper:]]/[[:lower:]] | 大/小寫字母 | |
| [[:punct:]] | 標點符號 | |
| [[:xdigit:]] | 16 進位數字 (0-9a-fA-F) |
REGEXP_LIKE(col, '^a{1,3}'):開頭 1~3 個 aREGEXP_LIKE(col, 'a{3}'):連續 3 個 aREGEXP_LIKE(col, '^a.*e$'):a 開頭 e 結尾REGEXP_LIKE(col, '^[[:alpha:]]+$'):純字母REGEXP_LIKE(col, '^[[:lower:][:digit:]]'):小寫或數字開頭REGEXP_LIKE(col, '^[^[:digit:]]'):非數字開頭(^ 在 [] 內表否定)SELECT REGEXP_SUBSTR('The zip code 80831 is for falcon, co', '[[:digit:]]{5}') FROM dual;
-- 80831
SELECT REGEXP_SUBSTR('The zip code 80831 is for falcon, co', '[[:alpha:]]{3,}', 1, 3) FROM dual;
-- code
SELECT REGEXP_SUBSTR('comments or questions - email feedback@plsqlbook.com',
'[[:alnum:]](([_\.\-\+]?[[:alnum:]]+)*)@([[:alnum:]]+)(([\.-]?[[:alnum:]]+)*)\.([[:alpha:]]{2,})')
FROM dual;
-- feedback@plsqlbook.com
SELECT REGEXP_INSTR('The zip code 80831 is for falcon, co', '[[:digit:]]{5}') FROM dual;
-- 14
SELECT REGEXP_REPLACE('Reformat the phone number 719-111-1111 ...',
'[1]?[-.]?(\(?[[:digit:]]{3}\)?)+[-.]?([[:digit:]]{3})[-.]?([[:digit:]]{4})',
' (\1) \2-\3') FROM dual;
-- Reformat the phone number (719) 111-1111 ...
SELECT ename, job FROM emp WHERE REGEXP_LIKE(job, '(clerk|analyst)', 'i'); -- 不分大小寫匹配 clerk 或 analyst
CREATE INDEX idx_regex ON t(REGEXP_SUBSTR(col, 'pattern'))REGEXP_COUNT 直接計數匹配次數