作者:Orson
出處:http://www.cnblogs.com/java-class/
Oracle 正則表達(dá)式
閱讀目錄
1.Oracle(regular expression)簡(jiǎn)單介紹
2.Oracle正則特殊字符
3.Oracle正則字符簇
4.各種操作符的運(yùn)算優(yōu)先級(jí)
5.模擬測(cè)試?yán)?/p>
6.Oracle對(duì)應(yīng)正則函數(shù)
回到頂部
1.Oracle(regular expression)簡(jiǎn)單介紹
正則表達(dá)式已經(jīng)在很多軟件中得到廣泛的應(yīng)用,包括*nix(Linux, Unix等)燎悍,HP等操作系統(tǒng)垂寥,PHP柄冲,C#鞠眉,Java等開發(fā)環(huán)境。
Oracle 10g正則表達(dá)式提高了SQL靈活性澄耍。有效的解決了數(shù)據(jù)有效性浊伙,重復(fù)詞的辨認(rèn), 無關(guān)的空白檢測(cè),或者分解多個(gè)正則組成的字符串等問題为障。
Oracle 10g支持正則表達(dá)式的四個(gè)新函數(shù)分別是:REGEXP_LIKE晦闰、REGEXP_INSTR、REGEXP_SUBSTR鳍怨、和REGEXP_REPLACE呻右。
它們使用POSIX 正則表達(dá)式代替了老的百分號(hào)(%)和通配符(_)字符。
回到頂部
2.Oracle正則特殊字符
'^' 匹配輸入字符串的開始位置鞋喇,在方括號(hào)表達(dá)式中使用声滥,此時(shí)它表示不接受該字符集合。
'$' 匹配輸入字符串的結(jié)尾位置侦香。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性落塑,則 $ 也匹配 '\n' 或'\r'。
'.'? 匹配除換行符 \n之外的任何單字符鄙皇。
'?' 匹配前面的子表達(dá)式零次或一次芜赌。
'*' 匹配前面的子表達(dá)式零次或多次。
'+' 匹配前面的子表達(dá)式一次或多次伴逸。
'( )' 標(biāo)記一個(gè)子表達(dá)式的開始和結(jié)束位置缠沈。
'[]' 標(biāo)記一個(gè)中括號(hào)表達(dá)式。
'{m,n}' 一個(gè)精確地出現(xiàn)次數(shù)范圍,m=<出現(xiàn)次數(shù)<=n洲愤,'{m}'表示出現(xiàn)m次颓芭,'{m,}'表示至少出現(xiàn)m次。
'|' 指明兩項(xiàng)之間的一個(gè)選擇柬赐。例子'^([a-z]+|[0-9]+)$'表示所有小寫字母或數(shù)字組合成的字符串亡问。
\num 匹配 num,其中 num 是一個(gè)正整數(shù)肛宋。對(duì)所獲取的匹配的引用州藕。
正則表達(dá)式的一個(gè)很有用的特點(diǎn)是可以保存子表達(dá)式以后使用,被稱為Backreferencing酝陈。
允許復(fù)雜的替換能力 如調(diào)整一個(gè)模式到新的位置或者指示被代替的字符或者單詞的位置床玻。
被匹配的子表達(dá)式存儲(chǔ)在臨時(shí)緩沖區(qū)中,緩沖區(qū)從左到右編號(hào), 通過\數(shù)字符號(hào)訪問沉帮。
下面的例子列出了把名字 aa bb cc 變成cc, bb, aa.
Select REGEXP_REPLACE('aa bb cc','(.*) (.*) (.*)', '\3, \2, \1') FROM dual锈死; REGEXP_REPLACE('ELLENHILDISMIT cc, bb, aa'\' 轉(zhuǎn)義符)
回到頂部
3.Oracle正則字符簇
[[:alpha:]] 任何字母。
[[:digit:]] 任何數(shù)字穆壕。
[[:alnum:]] 任何字母和數(shù)字待牵。
[[:space:]] 任何白字符。
[[:upper:]] 任何大寫字母喇勋。
[[:lower:]] 任何小寫字母缨该。
[[unct:]] 任何標(biāo)點(diǎn)符號(hào)。
[[:xdigit:]] 任何16進(jìn)制的數(shù)字川背,相當(dāng)于[0-9a-fA-F]压彭。
回到頂部
4.各種操作符的運(yùn)算優(yōu)先級(jí)
\ 轉(zhuǎn)義符
(), (?, (?=), [] 圓括號(hào)和方括號(hào)
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \anymetacharacter 位置和順序
| “或”操作
回到頂部
5.模擬測(cè)試?yán)?/p>
--測(cè)試數(shù)據(jù)
復(fù)制代碼
create table test(mc varchar2(60));
insert into test values('112233445566778899');
insert into test values('22113344 5566778899');
insert into test values('33112244 5566778899');
insert into test values('44112233 5566 778899');
insert into test values('5511 2233 4466778899');
insert into test values('661122334455778899');
insert into test values('771122334455668899');
insert into test values('881122334455667799');
insert into test values('991122334455667788');
insert into test values('aabbccddee');
insert into test values('bbaaaccddee');
insert into test values('ccabbddee');
insert into test values('ddaabbccee');
insert into test values('eeaabbccdd');
insert into test values('ab123');
insert into test values('123xy');
insert into test values('007ab');
insert into test values('abcxy');
insert into test values('The final test is is is how to find duplicate words.');
commit;
復(fù)制代碼
a.REGEXP_LIKE
復(fù)制代碼
select * from test where regexp_like(mc,'^a{1,3}');
select * from test where regexp_like(mc,'a{1,3}');
select * from test where regexp_like(mc,'^a.*e$');
select * from test where regexp_like(mc,'^[[:lower:]]|[[:digit:]]');
select * from test where regexp_like(mc,'^[[:lower:]]');
Select mc FROM test Where REGEXP_LIKE(mc,'[^[:digit:]]');
Select mc FROM test Where REGEXP_LIKE(mc,'^[^[:digit:]]');
復(fù)制代碼
b.REGEXP_INSTR
復(fù)制代碼
Select REGEXP_INSTR(mc,'[[:digit:]]$') from test;
Select REGEXP_INSTR(mc,'[[:digit:]]+$') from test;
Select REGEXP_INSTR('The price is $400.','\$[[:digit:]]+') FROM DUAL;
Select REGEXP_INSTR('onetwothree','[^[[:lower:]]]') FROM DUAL;
Select REGEXP_INSTR(',,,,,','[^,]*') FROM DUAL;
Select REGEXP_INSTR(',,,,,','[^,]') FROM DUAL;
復(fù)制代碼
c.REGEXP_SUBSTR
復(fù)制代碼
SELECT REGEXP_SUBSTR(mc,'[a-z]+') FROM test;
SELECT REGEXP_SUBSTR(mc,'[0-9]+') FROM test;
SELECT REGEXP_SUBSTR('aababcde','^a.*b') FROM DUAL;
d.REGEXP_REPLACE
Select REGEXP_REPLACE('Joe Smith','( ){2,}', ',') AS RX_REPLACE FROM dual;
Select REGEXP_REPLACE('aa bb cc','(.*) (.*) (.*)', '\3, \2, \1') FROM dual
復(fù)制代碼
回到頂部
6.Oracle對(duì)應(yīng)正則函數(shù)
regexp_like.regexp_instr.regexp_substr.與 regexp_replace。
它們?cè)谟梅ㄉ吓coracle sql 函數(shù)like.instr.substr 與replace 用法,但是它們使用posix 正則表達(dá)式代替了老的百分號(hào)(%)與通配符(_)字符渗常。
regexp_like 與like 操作符相似。如果第一個(gè)參數(shù)匹配正則表達(dá)式它就解析為true汗盘。
例如where regexp_like(ename,^j[ao],i) 將在ename 以ja 或jo 開始的情況下返回一行數(shù)據(jù)皱碘。參數(shù)指定正則表達(dá)式是大小寫敏感的。
另外還可以在check 約束與函數(shù)索引中指定regexp_like.例如: 【擴(kuò)展信息:MYSQL基本數(shù)據(jù)庫術(shù)語】隐孽。
^ 表示字符串的開始 $ 表示字符串的結(jié)束 . 表示任何字符字符的范圍癌椿,比如說[a-z],表示任何 ascii 小寫字母,與字符類"[[:lower:]]"" 等價(jià) ? 允許一個(gè)后繼字符匹配零次或一次 + 允許一個(gè)后繼字符匹配一次或多次 * 表示零次或多次菱阵。
可以使用"{m,n}" 指定一個(gè)精確地出現(xiàn)范圍,其意思是“出現(xiàn)從m 次到n 次”;"{m}" 表示“正好m次”;而"{m,}" 表示“至少m次”踢俄。
還可以使用圓括號(hào)組合字符的集合,使用"|"(豎線)表示可替換.例如,字符串^([a-z]+|[0-9]+)$將匹配所有由小寫字母或數(shù)字組合成的字符串。