時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)
Oracle 10g數(shù)據(jù)庫內(nèi)建了符合IEEE POSIX (Portable Operating System for Unix)標(biāo)準(zhǔn)的正則表達式。熟練使用正則表達式,可以寫出簡潔,強大的SQL語句。
正則表達式有幾個優(yōu)點優(yōu)于常見的LIKE操作符和INSTR、SUBSTR及REPLACE 函數(shù)的。這些傳統(tǒng)的SQL 函數(shù)不便于進行模式匹配。只有LIKE 操作符通過使用%和_字符匹配,但LIKE不支持表達式的重復(fù)、復(fù)雜的更替、字符范圍、字符列表和POSIX 字符類等等。
元字符(Meta Character):
Sql代碼
^????? 使表達式定位至一行的開頭
$????? 使表達式定位至一行的末尾
*????? 匹配 0 次或更多次
?????? 匹配 0 次或 1 次
+????? 匹配 1 次或更多次
{m}??? 正好匹配 m 次
{m,}?? 至少匹配 m 次
{m, n} 至少匹配 m 次但不超過 n 次
[:alpha:]??? 字母字符
[:lower:]??? 小寫字母字符
[:upper:]??? 大寫字母字符
[:digit:]??? 數(shù)字
[:alnum:]??? 字母數(shù)字字符
[:space:]??? 空白字符(禁止打?。缁剀嚪?、換行符、豎直制表符和換頁符[:punct:]??? 標(biāo)點字符
[:cntrl:]??? 控制字符(禁止打?。?/p>
[:print:]??? 可打印字符 | 分隔替換選項,通常與分組操作符 () 一起使用
( )??? 將子表達式分組為一個替換單元、量詞單元或后向引用單元
[char] 字符列表
Oracle 10g提供了四個regexp function: REGEXP_LIKE , REGEXP_REPLACE , REGEXP_INSTR , REGEXP_SUBSTR 。
Sql代碼
REGEXP_LIKE:比較一個字符串是否與正則表達式匹配
(srcstr, pattern [, match_option])
REGEXP_INSTR:在字符串中查找正則表達式,并且返回匹配的位置
(srcstr, pattern [, position [, occurrence [, return_option [, match_option]]]])
REGEXP_SUBSTR:返回與正則表達式匹配的子字符串
(srcstr, pattern [, position [, occurrence [, match_option]]])
REGEXP_REPLACE:搜索并且替換匹配的正則表達式
(srcstr, pattern [, replacestr [, position [, occurrence [, match_option]]]])? 其中各參數(shù)的含義為:
Sql代碼
srcstr:? 被查找的字符數(shù)據(jù)。
pattern: 正則表達式。
occurrence:??? 出現(xiàn)的次數(shù)。默認為1。
position:????? 開始位置
return_option: 默認值為0,返回該模式的起始位置;值為1則返回符合匹配條件的下一個字符的起始位置。
#p#副標(biāo)題#e#
replacestr:??? 用來替換匹配模式的字符串。
match_option:? 匹配方式選項。缺省為c。
c:case sensitive
I:case insensitive
n:(.)匹配任何字符(包括newline)
m:字符串存在換行的時候被作為多行處理
下面通過一些具體的例子來說明如何使用這四個函數(shù)。首先創(chuàng)建一個測試數(shù)據(jù)表,
Sql代碼
SQL> create table person (
2? first_name varchar(20),
3? last_name varchar(20),
4? email varchar(100),
5? zip varchar(6));
Table created.
SQL> insert into person values ('Steven', 'Chen', '[email protected]', '123456');
1 row created.
SQL> insert into person values ('James', 'Li', '[email protected]' || chr(10) || '[email protected]', '1b3d5f');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from person;
FIRST_NAME LAST_NAME? EMAIL??? ZIP
---------- ---------- -------------------- ------
Steven???? Chen [email protected]? 123456
James????? Li?? [email protected]????? 1b3d5f
1。REGEXP_LIKE
Sql代碼
SQL> select zip as invalid_zip from person where regexp_like(zip, '[^[:digit:]]');
INVALID_ZIP
--------------------
1b3d5f
SQL> select first_name from person where regexp_like(first_name, '^S.*n$');
FIRST_NAME
----------
Steven
SQL> select first_name from person where regexp_like(first_name, '^s.*n$');
no rows selected
SQL> select first_name from person where regexp_like(first_name, '^s.*n$', 'c');
no rows selected
SQL> select first_name from person where regexp_like(first_name, '^s.*n$', 'i');
FIRST_NAME
----------
Steven
SQL> select email from person where regexp_like(email, '^james.*com$');
no rows selected
SQL> select email from person where regexp_like(email, '^james.*com$', 'n');
--------------------
SQL> select email from person where regexp_like(email, '^li.*com$');
no rows selected
SQL> select email from person where regexp_like(email, '^li.*com$', 'm');
--------------------
2。REGEXP_INSTR
Sql代碼
查找zip中第一個非數(shù)字字符的位置
SQL> select regexp_instr(zip, '[^[:digit:]]') as position from person;
POSITION
----------
0
2
#p#副標(biāo)題#e#
從第三個字符開始,查找zip中第二個非數(shù)字字符的位置
SQL> select regexp_instr(zip, '[^[:digit:]]', 3, 2) as position from person;
POSITION
----------
0
6
從第三個字符開始,查找zip中第二個非數(shù)字字符的下一個字符位置
SQL> select regexp_instr(zip, '[^[:digit:]]', 3, 2, 1) as position from person;
POSITION
----------
0
7
3。REGEXP_SUBSTR
Sql代碼
SQL> select regexp_substr(zip, '[^[:digit:]]') as zip from person;
ZIP
------------------
b
SQL> select regexp_substr(zip, '[^[:digit:]]', 3, 2) as zip from person;
ZIP
------------
f
4。REGEXP_REPLACE
Sql代碼
把zip中所有非數(shù)字字符替換為0
SQL> update person set zip=regexp_replace(zip, '[^[:digit:]]', '0')
2? where regexp_like(zip, '[^[:digit:]]');
1 row updated.
SQL> select zip from person;
ZIP
------
123456
103050
后向引用(backreference):
后向引用是 一個很有用的特性。它能夠把子表達式的匹配部分保存在臨時緩沖區(qū)中,供以后重用 。緩沖區(qū)從左至右進行編號,并利用 \digit 符號進行訪問。子表達式用一組圓括號來顯示。利用后向引用可以
關(guān)鍵詞標(biāo)簽:Oracle
相關(guān)閱讀
熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索
人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法