傳統 LIKE 僅支援 % 與 _ 萬用字元,處理複雜字串模式匹配力不從心。Oracle 10g 引入四大正則函數,11g 新增 REGEXP_COUNT,提供強大的字串解析、驗證、萃取與轉換能力。本文系統整理元字元語法、五大函數用法與實戰範例。
| 元字元 | 含義 | 範例 |
|---|---|---|
\ | 跳脫字元,匹配特殊字元本身 | \\匹配 \,\(匹配 ( |
^ | 字串開頭 | ^a匹配 "arwen" 不匹配 "barwen" |
$ | 字串結尾 | en$匹配 "arwen" 不匹配 "arwenb" |
* | 前一字元 0 次或多次 | a*rwen匹配 "rwen" 或 "aaarwen" |
+ | 前一字元 1 次或多次 | a+rwen匹配 "arwen" 不匹配 "rwen" |
? | 前一字元 0 次或 1 次 | a?rwen匹配 "arwen" 或 "rwen" |
{n} | 前一字元恰好 n 次 | ar{2}wen匹配 "arrwen" |
{n,m} | 前一字元 n 到 m 次 | ar{1,2}wen匹配 "arwen","arrwen" |
. | 任意單一字元 (除 NULL、換行) | arw.n匹配 "arwen","arwin" |
(pattern) | 子運算式分組,可供反向引用 | (ab)+匹配 "ababab" |
x|y | 或邏輯 | a|b匹配 a 或 b |
[abc] | 字元集合,匹配任一字元 | hello[abc]匹配 helloa/hellob/helloc |
[a-z] | 字元範圍 | [a-z]匹配任一小寫字母 |
[::] | POSIX 字元類別 | [:digit:]匹配 0-9,[:alpha:]匹配字母 |
\n | 反向引用第 n 個分組 | arw(en)\1匹配 "arwenen" |
CREATE TABLE regexp_li0924 (text VARCHAR(20));
INSERT INTO regexp_li0924 VALUES ('123');
INSERT INTO regexp_li0924 VALUES ('123a');
INSERT INTO regexp_li0924 VALUES ('123123?');
INSERT INTO regexp_li0924 VALUES ('afefwef');
INSERT INTO regexp_li0924 VALUES ('?');
INSERT INTO regexp_li0924 VALUES ('AFWEWE');
INSERT INTO regexp_li0924 VALUES ('1_2_3');
INSERT INTO regexp_li0924 VALUES ('1fe_24563');
REGEXP_LIKE(srcstr, pattern[, match_option])
match_option: c區分大小寫(預設)、i不區分、n點號匹配換行、m多行模式
-- 含數字 SELECT * FROM regexp_li0924 WHERE REGEXP_LIKE(text, '[[:digit:]]'); -- 含問號 (需跳脫) SELECT * FROM regexp_li0924 WHERE REGEXP_LIKE(text, '\?'); -- 含 a 或 A (兩種寫法) SELECT * FROM regexp_li0924 WHERE REGEXP_LIKE(text, 'a', 'i'); SELECT * FROM regexp_li0924 WHERE REGEXP_LIKE(text, '(a|A)');
REGEXP_INSTR(srcstr, pattern[, start[, occurrence[, return_option[, match_option]]]])
-- 找第一個非數字位置
SELECT REGEXP_INSTR(text, '[^[:digit:]]'), text FROM regexp_li0924;
-- 從第2字元起找第3個非數字位置
SELECT REGEXP_INSTR('f2345ef456', '[^[:digit:]]', 2, 3) FROM dual; -- 返回 7
-- 找第2個非數字的下一字元位置 (return_option=1)
SELECT REGEXP_INSTR('f2345ef456', '[^[:digit:]]', 2, 2, 1) FROM dual;
REGEXP_REPLACE(srcstr, pattern[, replace_string[, start[, occurrence[, match_option]]]])
-- 取 123_1563 中底線前部分 (反向引用 \1)
SELECT REGEXP_REPLACE('123_1563', '(.*)_(.*)', '\1') FROM dual; -- 123
-- 移除底線及後續數字
SELECT REGEXP_REPLACE('123_1563', '_[[:digit:]]+', '') FROM dual; -- 123
-- 非數字替換為 0
SELECT REGEXP_REPLACE('123456fewfwefe34165', '[^[:digit:]]', '0') FROM dual;
-- 姓名姓氏互換 (英文習慣)
SELECT REGEXP_REPLACE('mei han', '(.*) (.*)', '\2 \1') FROM dual; -- han mei
REGEXP_SUBSTR(srcstr, pattern[, start[, occurrence[, match_option]]])
-- 從 MMS_2501_MO 取第2段 (以 _ 分隔)
SELECT REGEXP_SUBSTR('MMS_2501_MO', '[^_]+', 1, 2) FROM dual; -- 2501
REGEXP_COUNT(srcstr, pattern[, match_option])
-- 統計字串中 '0' 出現次數
SELECT REGEXP_COUNT('12308045600460', '0') FROM dual; -- 返回 4
SQL Server 無原生正則函數,LIKE 僅支援 %、_、[]、[^] 萬用字元。複雜模式需用 CLR 整合或應用層處理。