首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle 正則表達式函數完整指南:REGEXP_LIKE/INSTR/REPLACE/SUBSTR/COUNT

     編輯:Oracle 教學

Oracle 正則表達式函數完整指南:REGEXP_LIKE/INSTR/REPLACE/SUBSTR/COUNT

傳統 LIKE 僅支援 % 與 _ 萬用字元,處理複雜字串模式匹配力不從心。Oracle 10g 引入四大正則函數,11g 新增 REGEXP_COUNT,提供強大的字串解析、驗證、萃取與轉換能力。本文系統整理元字元語法、五大函數用法與實戰範例。

1. 正則元字元速查表

元字元含義範例
\跳脫字元,匹配特殊字元本身\\匹配 \,\(匹配 (
^字串開頭^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"

2. 測試資料準備

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');

3. 五大正則函數詳解

REGEXP_LIKE - 模式匹配驗證 (回傳 Boolean)

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 - 返回匹配位置 (擴展 INSTR)

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 - 字串替換 (擴展 REPLACE)

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 - 萃取匹配子串 (字串分割神器)

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 - 統計匹配次數 (11g+)

REGEXP_COUNT(srcstr, pattern[, match_option])
-- 統計字串中 '0' 出現次數
SELECT REGEXP_COUNT('12308045600460', '0') FROM dual; -- 返回 4

4. SQL Server 對比說明

SQL Server 無原生正則函數,LIKE 僅支援 %、_、[]、[^] 萬用字元。複雜模式需用 CLR 整合或應用層處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved