Oracle g數(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ǔ)句
寧江網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),寧江網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為寧江上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的寧江做網(wǎng)站的公司定做!
正則表達(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 字符類(lèi)等等
元字符(Meta Character)
Sql代碼
^??????????? 使表達(dá)式定位至一行的開(kāi)頭
$??????????? 使表達(dá)式定位至一行的末尾
*??????????? 匹配 次或更多次
???????????? 匹配 次或 次
+??????????? 匹配 次或更多次
{m}????????? 正好匹配 m 次
{m }???????? 至少匹配 m 次
{m n}?????? 至少匹配 m 次但不超過(guò) n 次
[:alpha:]??? 字母字符
[:lower:]??? 小寫(xiě)字母字符
[:upper:]??? 大寫(xiě)字母字符
[:digit:]??? 數(shù)字
[:alnum:]??? 字母數(shù)字字符
[:space:]??? 空白字符(禁止打印) 如回車(chē)符 換行符 豎直制表符和換頁(yè)符[:punct:]??? 標(biāo)點(diǎn)字符
[:cntrl:]??? 控制字符(禁止打?。?/p>
[:print:]??? 可打印字符 | 分隔替換選項(xiàng) 通常與分組操作符 () 一起使用
( )????????? 將子表達(dá)式分組為一個(gè)替換單元 量詞單元或后向引用單元
[char]?????? 字符列表
Oracle g提供了四個(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)為
position:????? 開(kāi)始位置
return_option: 默認(rèn)值為 返回該模式的起始位置 值為 則返回符合匹配條件的下一個(gè)字符的起始位置
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 (
first_name varchar( )
last_name varchar( )
email varchar( )
zip varchar( ));
Table created
SQL insert into person values ( Steven Chen );
row created
SQL insert into person values ( James Li || chr( ) || b d f );
row created
SQL mit;
Commit plete
SQL select * from person;
FIRST_NAME LAST_NAME? EMAIL??????????????? ZIP
Steven???? Chen?????? ???????
James????? Li???????? ????? b d f
REGEXP_LIKE
Sql代碼
SQL select zip as invalid_zip from person where regexp_like(zip [^[:digit:]] );
INVALID_ZIP
b d f
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 *$ );
no rows selected
SQL select email from person where regexp_like(email ^james *$ n );
SQL select email from person where regexp_like(email ^li *$ );
no rows selected
SQL select email from person where regexp_like(email ^li *$ m );
REGEXP_INSTR
Sql代碼
查找zip中第一個(gè)非數(shù)字字符的位置
SQL select regexp_instr(zip [^[:digit:]] ) as position from person;
POSITION
從第三個(gè)字符開(kāi)始 查找zip中第二個(gè)非數(shù)字字符的位置
SQL select regexp_instr(zip [^[:digit:]] ) as position from person;
POSITION
從第三個(gè)字符開(kāi)始 查找zip中第二個(gè)非數(shù)字字符的下一個(gè)字符位置
SQL select regexp_instr(zip [^[:digit:]] ) as position from person;
POSITION
REGEXP_SUBSTR
Sql代碼
SQL select regexp_substr(zip [^[:digit:]] ) as zip from person;
ZIP
b
SQL select regexp_substr(zip [^[:digit:]] ) as zip from person;
ZIP
f
REGEXP_REPLACE
Sql代碼
把zip中所有非數(shù)字字符替換為
SQL update person set zip=regexp_replace(zip [^[:digit:]] )
where regexp_like(zip [^[:digit:]] );
row updated
SQL select zip from person;
ZIP
后向引用(backreference)
后向引用是 一個(gè)很有用的特性 它能夠把子表達(dá)式的匹配部分保存在臨時(shí)緩沖區(qū)中 供以后重用 緩沖區(qū)從左至右進(jìn)行編號(hào) 并利用 \digit 符號(hào)進(jìn)行訪問(wèn) 子表達(dá)式用一組圓括號(hào)來(lái)顯示 利用后向引用可以實(shí)現(xiàn)較復(fù)雜的替換功能
Sql代碼
SQL select regexp_replace( Steven Chen ( *) ( *) \ \ ) as reversed_name from dual;
REVERSED_NAME
Chen Steven
在DDL中也可以正則表達(dá)式 比如Constraint index view
Sql代碼
SQL alter table person add constraint constraint_zip check (regexp_like(zip ^[[:digit:]]+$ ));
lishixinzhi/Article/program/Oracle/201311/18745
oracle使用正則表達(dá)式列入兩個(gè)固定字符中間的數(shù)據(jù)方法:
1、正則表達(dá)式的使用需要用到關(guān)鍵字REGEXP,用定義一組字符,表示匹配125三個(gè)字符。
2、digit表示匹配任意數(shù)字,DOT表示ALL表示所有,連起來(lái)匹配包括換行符默認(rèn)模式下.是不能匹配行符n的。
函數(shù)格式如下:
function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
__srcstr :需要進(jìn)行正則處理的字符串
__pattern :進(jìn)行匹配的正則表達(dá)式
__position :起始位置,從第幾個(gè)字符開(kāi)始正則表達(dá)式匹配(默認(rèn)為1)
__occurrence :標(biāo)識(shí)第幾個(gè)匹配組,默認(rèn)為1
__modifier :模式('i'不區(qū)分大小寫(xiě)進(jìn)行檢索;'c'區(qū)分大小寫(xiě)進(jìn)行檢索。默認(rèn)為'c'。)
用 regexp_like這個(gè)函數(shù)來(lái)解決,正則表達(dá)式為:[[:punct:]]+這個(gè)正則可以找出任何標(biāo)點(diǎn)符號(hào)。
查詢value中包含任何標(biāo)點(diǎn)符號(hào)的記錄如下:
select * from xxx where regexp_like(value,'[[:punct:]]+');
POSIX 正則表達(dá)式由標(biāo)準(zhǔn)的元字符(metacharacters)所構(gòu)成: '$' 匹配輸入字符串的結(jié)尾位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。 '?' 匹配前面的子表達(dá)式零次或一次。 '*' 匹配前面的子表達(dá)式零次或多次。
'|' 指明兩項(xiàng)之間的一個(gè)選擇。例子'^([a-z]+|[0-9]+)$'表示所有小寫(xiě)字母或數(shù)字組合成的 '( )' 標(biāo)記一個(gè)子表達(dá)式的開(kāi)始和結(jié)束位置。 '{m,n}' 一個(gè)精確地出現(xiàn)次數(shù)范圍,m=出現(xiàn)次數(shù)=n,'{m}'表示出現(xiàn)m次,'{m,}'表示至少出現(xiàn)m次。
\num 匹配 num,其中 num 是一個(gè)正整數(shù)。對(duì)所獲取的匹配的引用。 [[:alpha:]] 任何字母。
[[:digit:]] 任何數(shù)字。
[[:alnum:]] 任何字母和數(shù)字。
[[:space:]] 任何白字符。
[[:upper:]] 任何大寫(xiě)字母。
[[:lower:]] 任何小寫(xiě)字母。
[[:punct:]] 任何標(biāo)點(diǎn)符號(hào)。
[[:xdigit:]] 任何16進(jìn)制的數(shù)字,相當(dāng)于[0-9a-fA-F]。 \轉(zhuǎn)義符 *, +, ?, {n}, {n,}, {n,m} 限定符^, $, anymetacharacter 位置和順序。