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