Oracle 提供了一組強大的正則表達式函數,用于在 SQL 和 PL/SQL 中進行復雜的模式匹配和文本處理。這些函數基于 POSIX 標準正則表達式,功能強大且靈活。
目錄
一、Oracle 正則表達式函數概覽
二、函數詳解及示例
1. REGEXP_LIKE
2. REGEXP_INSTR
3. REGEXP_SUBSTR
4. REGEXP_REPLACE
5. REGEXP_COUNT
三、正則表達式模式元素
四、高級正則表達式技巧
1. 后向引用
2. 非貪婪匹配
3. 零寬斷言
五、性能考慮
六、綜合應用示例
1. 數據驗證
2. 數據清洗
3. 復雜文本分析
七、各Oracle版本的正則表達式支持
一、Oracle 正則表達式函數概覽
Oracle 主要提供以下正則表達式函數:
- REGEXP_LIKE:檢查字符串是否匹配正則表達式模式
- REGEXP_INSTR:返回匹配子串的位置
- REGEXP_SUBSTR:提取匹配的子串
- REGEXP_REPLACE:替換匹配的子串
- REGEXP_COUNT (11g+):計算匹配出現的次數
二、函數詳解及示例
1. REGEXP_LIKE
【功能:】檢查字符串是否匹配指定的正則表達式模式,返回滿足條件的字段【語法:】
REGEXP_LIKE(source_string, pattern [, match_parameter])
regexp_like(列名,匹配模式,匹配行為)
由正則表達式構成匹配模式,長度在512個字節內【參數:】
source_string:要搜索的字符串
pattern:正則表達式模式
match_parameter:可選,修改匹配行為,可包含以下字符:'i':不區分大小寫'c':區分大小寫'n':允許點號(.)匹配換行符'm':多行模式【示例:】
-- 檢查字符串是否包含數字
SELECT * FROM employees
WHERE REGEXP_LIKE(job_id, '[0-9]');-- 不區分大小寫匹配
SELECT * FROM customers
WHERE REGEXP_LIKE(name, '^john', 'i');
2. REGEXP_INSTR
【功能:】返回匹配子字符串的起始或結束位置;返回滿足條件的字符或字符串的位置【語法:】
REGEXP_INSTR(source_string, pattern [, start_position [, occurrence [, return_option [, match_parameter [, subexpression]]]])
regexp_instr(列名,匹配模式,數1,數2,匹配行為)--從數1位開始查,查第數2次匹配的位置【參數:】
start_position:開始搜索的位置,默認為1
occurrence: 要查找的第幾個匹配項,默認為1
return_option:0:返回匹配的第一個字符位置(默認)1:返回匹配后的下一個字符位置
subexpression: 對于有子表達式的模式,指定哪個子表達式【示例:】
-- 查找第一個數字出現的位置
SELECT REGEXP_INSTR('Order 12345', '[0-9]') FROM dual;
-- 結果:7-- 查找第二個數字出現的位置
SELECT REGEXP_INSTR('Order 12345', '[0-9]', 1, 2) FROM dual;
-- 結果:8-- 查找電子郵件中的域名位置
SELECT REGEXP_INSTR('user@example.com', '@[^.]+\\.') FROM dual;
3. REGEXP_SUBSTR
【功能:】提取匹配正則表達式的子字符串【語法:】
REGEXP_SUBSTR(source_string, pattern [, start_position [, occurrence [, match_parameter [, subexpression]]]])
regexp_substr(列名,匹配模式,數1,數2,匹配行為)【示例:】
-- 提取字符串中的第一個數字序列
SELECT REGEXP_SUBSTR('Order 12345 for 678 items', '[0-9]+') FROM dual;
-- 結果:12345-- 提取電子郵件中的用戶名
SELECT REGEXP_SUBSTR('user@example.com', '^[^@]+') FROM dual;
-- 結果:user-- 提取第三個由空格分隔的單詞
SELECT REGEXP_SUBSTR('Oracle Database 12c', '[^ ]+', 1, 3) FROM dual;
-- 結果:12c
4. REGEXP_REPLACE
【功能:】替換匹配正則表達式的子字符串【語法:】
REGEXP_REPLACE(source_string, pattern [, replace_string [, start_position [, occurrence [, match_parameter]]])
regexp_replace(列名,匹配模式,字符,數1,數2,匹配行為)【示例:】
-- 隱藏信用卡號中間數字
SELECT REGEXP_REPLACE('Card: 1234-5678-9012-3456', '([0-9]{4})-([0-9]{2})[0-9]{2}-([0-9]{4})', '\1-XX-XX-\3') FROM dual;
-- 結果:Card: 1234-XX-XX-3456-- 標準化日期格式
SELECT REGEXP_REPLACE('31/12/2023', '([0-9]{2})/([0-9]{2})/([0-9]{4})', '\3-\2-\1') FROM dual;
-- 結果:2023-12-31-- 移除所有非字母字符
SELECT REGEXP_REPLACE('A1B2C3', '[^A-Za-z]', '') FROM dual;
-- 結果:ABC
5. REGEXP_COUNT
【功能:】計算正則表達式模式出現的次數(Oracle 11g+)【語法:】
REGEXP_COUNT(source_string, pattern [, start_position [, match_parameter]])
regexp_count(列名,匹配模式,數1,匹配行為)--從數1位開始查【示例:】
-- 計算字符串中數字出現的次數
SELECT REGEXP_COUNT('Order 12345 for 678 items', '[0-9]') FROM dual;
-- 結果:8-- 計算單詞"the"出現的次數(不區分大小寫)
SELECT REGEXP_COUNT('The quick brown fox jumps over the lazy dog', '\bthe\b', 1, 'i') FROM dual;
-- 結果:2
三、正則表達式模式元素
Oracle 支持的標準正則表達式元字符:
元字符 | 描述 | 示例 |
^ |