首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 10g 正規表達式:寫出更強大的 SQL

     編輯:MySQL 資料庫相關知識

為什麼需要正規表達式?

傳統 LIKE、INSTR、SUBSTR、REPLACE 處理複雜文本模式(電話、郵遞區號、Email、HTML 標籤、日期格式)時,寫法冗長且易出錯。Oracle 10g 引入 POSIX 相容的正規表達式函數,提供聲明式模式匹配能力。

核心函數與操作符

函數/操作符用途對應傳統函數
REGEXP_LIKE WHERE 子句模式比對 LIKE
REGEXP_INSTR 搜尋模式出現位置 INSTR
REGEXP_SUBSTR 擷取符合模式的子字串 SUBSTR
REGEXP_REPLACE 以模式替換字串 REPLACE

常用元字符速查

元字符含義範例
. 任意單一字元(換行除外) a.b 匹配 axb、aab
^ 行首定位 ^abc 以 abc 開頭
$ 行尾定位 abc$ 以 abc 結尾
* 前一元素 0 次或多次 ab*c 匹配 ac、abc、abbc
+ 前一元素 1 次或多次 ab+c 至少一個 b
? 前一元素 0 次或 1 次 ab?c 匹配 ac 或 abc
{m,n} 前一元素 m~n 次 \d{3,5} 3-5 位數字
[...] 字元類別 [aeiou] 元音字母
[^...] 排除字元類別 [^0-9] 非數字
\d 數字 [0-9] \d+ 一或多位數字
\w 單字字元 [a-zA-Z0-9_] \w+ 單字
\s 空白字元 \s* 任意空白

實戰範例

1. 驗證 Email 格式

SELECT email
FROM users
WHERE REGEXP_LIKE(email, '^[\w\.-]+@[\w\.-]+\.\w{2,4}$');

2. 擷取電話號碼(含分機)

SELECT REGEXP_SUBSTR(phone, '\(\d{3}\)\s*\d{3}-\d{4}(?:\s*ext\.?\s*\d+)?')
FROM contacts;

3. 移除 HTML 標籤

SELECT REGEXP_REPLACE(content, '<[^>]+>', '')
FROM articles;

4. 偵測連續重複單字

SELECT REGEXP_SUBSTR(text, '(\b\w+\b)\s+\1')
FROM documents;

效能提示

  • 避免在大表全掃描中使用複雜正規表達式;建立函數索引:CREATE INDEX idx_email_chk ON users(REGEXP_LIKE(email, '...'))(Oracle 11g+ 支援虛擬欄位索引)。
  • 簡單前綴匹配仍優先用 LIKE 'abc%' 利用 B-tree 索引。
  • 編譯正規表達式有 CPU 開銷,重複呼叫時考慮 DETERMINISTIC 函數快取。

遷移建議

既有 LIKE、INSTR 邏輯可漸進式改寫:優先處理「驗證格式、抽取結構化欄位、清洗髒資料」三類高價值場景。

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