REPLACE 函數(shù)是用另外一個(gè)值來(lái)替代串中的某個(gè)值。例如,可以用一個(gè)匹配數(shù)字來(lái)替代字母的每一次出現(xiàn)。REPLACE 的格式如下所示:
REPLACE?(?char,?search_string?[,?replace_string])?如果沒有指定replace_string 變量的值,那么當(dāng)發(fā)現(xiàn)search_string 變量的值時(shí),就將其刪除。輸入可以為任何字符數(shù)據(jù)類型——CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB或NCLOB。下面是一個(gè)示例:
REPLACE('GEORGE',?'GE',?'EG')?=?EGOREG ?REPLACE('GEORGE',?'GE',?NULL)?=?OR?如果搜索串的長(zhǎng)度不為零,則可以知道搜索串在某個(gè)串中出現(xiàn)的次數(shù)。首先,計(jì)算源串的長(zhǎng)度:
LENGTH('GEORGE')?然后,計(jì)算源串刪除搜索串以后的長(zhǎng)度:
LENGTH(REPLACE('GEORGE',?'GE',?NULL))?接著用搜索串的長(zhǎng)度除以兩次的長(zhǎng)度之差,就可以得到搜索串出現(xiàn)的次數(shù):
select?LENGTH('GEORGE') ?-?LENGTH(REPLACE('GEORGE',?'GE',?NULL)) ?/ ?LENGTH('GE')?AS?Counter ?from?DUAL; ?COUNTER ?-------?REGEXP_REPLACE 函數(shù)在幾個(gè)方面擴(kuò)展了REPLACE 函數(shù)的功能。它支持在搜索模式中使用正則表達(dá)式,也支持本章前面描述的變量,即position、occurrence 和match_parameter,從而可以選擇只替代某些匹配的值,或者不區(qū)分大小寫。REGEXP_REPLACE 函數(shù)的語(yǔ)法如下所示:
REGEXP_REPLACE(?source_string,?pattern ?[,?replace_string ?[,?position ?[,?occurrence ?[,?match_parameter?] ?] ?] ?] ?)?除了replace_string,這里所有的變量都已經(jīng)在本章前面章節(jié)作了介紹。replace_string 告訴Oracle 用什么來(lái)替代source_string 中與pattern 匹配的部分。occurrence 變量是一個(gè)非負(fù)整數(shù),它指定操作的次數(shù):如果為0,則所有的匹配項(xiàng)都被替代;如果指定一個(gè)正數(shù),則Oracle替代第n 次匹配。
考慮ADDRESS 表中的Phone 列。首先,尋找格式為###-###-#### 的號(hào)碼。該格式分為3 部分,分別是3 個(gè)數(shù)字的集合、后面是另3 個(gè)數(shù)字的一個(gè)集合,然后又是4 個(gè)數(shù)字的一個(gè)集合,中間用‘-’符號(hào)隔開。通過(guò)在REGEXP_SUBSTR 函數(shù)調(diào)用中查找那些數(shù)字集合,可以找到與該標(biāo)準(zhǔn)匹配的行:
select?REGEXP_SUBSTR?(Phone, ?'([[:digit:]]{3})-([[:digit:]]{3})-([[:digit:]]{4})' ?)?"REGEXP_SUBSTR" ?from?ADDRESS; ?REGEXP_SUBST ?------------ ?213-555-0223 ?415-555-7530 ?214-555-8383 ?312-555-1166 ?707-555-8900 ?312-555-1414 ?415-555-6842 ?415-555-2178 ?415-555-7387 ?415-555-7512 ?415-555-6252 ?617-555-0125 ?603-555-2242 ?202-555-1414 ?718-555-1638 ?214-555-8383 ?503-555-7491?現(xiàn)在,使用REGEXP_REPLACE 把前3 個(gè)數(shù)字放在圓括號(hào)內(nèi),同時(shí)省略第一個(gè)‘-’符號(hào)。為此,我們將第1 個(gè)數(shù)字集稱為 \1,第2 個(gè)數(shù)據(jù)集稱為 \2,第3 個(gè)數(shù)據(jù)集稱為\3。
select?REGEXP_REPLACE?(Phone, ?'([[:digit:]]{3})-([[:digit:]]{3})-([[:digit:]]{4})' ?,?'(\1)?\2-\3' ?)?"REGEXP_REPLACE" ?from?ADDRESS; ?REGEXP_REPLACE ?------------------------------------------ ?(213)?555-0223 ?(415)?555-7530 ?(214)?555-8383 ?(312)?555-1166 ?(707)?555-8900 ?(312)?555-1414 ?(415)?555-6842 ?(415)?555-2178 ?(415)?555-7387 ?(415)?555-7512 ?(415)?555-6252 ?(617)?555-0125 ?(603)?555-2242 ?(202)?555-1414 ?(718)?555-1638 ?(214)?555-8383 ?(503)?555-7491?輸出說(shuō)明了REGEXP_REPLACE 函數(shù)調(diào)用的結(jié)果,即區(qū)號(hào)用圓括號(hào)括起來(lái),第一個(gè)'-'被去掉。
為了說(shuō)明occurrenc 變量的工作原理,下面的REGEXP_REPLACE 函數(shù)調(diào)用是用句點(diǎn)來(lái)替代電話號(hào)碼中的第二個(gè)'5':
select?REGEXP_REPLACE?(Phone, ?'5',?'.', ?1,?2 ?)?"REGEXP_REPLACE" ?from?ADDRESS; ?REGEXP_REPLACE ?------------------------------------------ ?213-5.5-0223 ?415-.55-7530 ?214-5.5-8383 ?312-5.5-1166 ?707-5.5-8900 ?312-5.5-1414 ?415-.55-6842 ?415-.55-2178 ?415-.55-7387 ?415-.55-7512 ?415-.55-6252 ?617-5.5-0125 ?603-5.5-2242 ?202-5.5-1414 ?718-5.5-1638 ?214-5.5-8383 ?503-.55-7491?可以進(jìn)一步修改該查詢語(yǔ)句,排除前3 個(gè)可能匹配的數(shù)字(開始位置設(shè)為4),并替代第4次出現(xiàn):
select?REGEXP_REPLACE?(Phone, ?'5',?'.', ?4,?4 ?)?"REGEXP_REPLACE" ?from?ADDRESS; ?REGEXP_REPLACE ?------------------------------------------ ?213-555-0223 ?415-555-7.30 ?214-555-8383 ?312-555-1166 ?707-555-8900 ?312-555-1414 ?415-555-6842 ?415-555-2178 ?415-555-7387 ?415-555-7.12 ?415-555-62.2 ?617-555-012. ?603-555-2242 ?202-555-1414 ?718-555-1638 ?214-555-8383 ?503-555-7491?通過(guò)在where 子句中使用REGEXP_INSTR,可以限制返回的行。在本例中,只顯示那些至少含有4 個(gè)‘5’的行(從第4 個(gè)字符開始)。因?yàn)樵撍阉髂J讲⒉粡?fù)雜,所以這里也可以使用INSTR 函數(shù)。
select?REGEXP_REPLACE?(Phone, ?'5',?'.', ?4,?4 ?)?"REGEXP_REPLACE" ?from?ADDRESS ?where?REGEXP_INSTR(Phone,?'5',4,4)?>?0; ?415-555-7.30 ?415-555-7.12 ?415-555-62.2 ?617-555-012.?可以使用該功能來(lái)搜索可供選擇的值,從而在單個(gè)查詢中組合使用多個(gè)查詢標(biāo)準(zhǔn)。在下面的示例中,可以替代5 或者2;‘5’和‘2’的出現(xiàn)次數(shù)都記入occurrence 統(tǒng)計(jì)量中:
select?REGEXP_REPLACE?(Phone, ?'(5|2)',?'.', ?4,?4 ?)?"REGEXP_REPLACE" ?from?ADDRESS ?where?REGEXP_INSTR(Phone,?'(5|2)',4,4)?>?0; ?REGEXP_REPLACE ?------------------------------------------ ?213-555-0.23 ?415-555-7.30 ?415-555-684. ?415-555-.178 ?415-555-7.12 ?415-555-6.52 ?617-555-01.5 ?603-555-.242?由于該示例中出現(xiàn)的‘|’符號(hào)是一個(gè)可選的運(yùn)算符,因此,匹配兩個(gè)指定值中任何一個(gè)都將返回一行。關(guān)于正則表達(dá)式中支持的更多運(yùn)算符,請(qǐng)參閱表8-1。
轉(zhuǎn)載于:https://www.cnblogs.com/maowh/p/3711656.html
總結(jié)
以上是生活随笔為你收集整理的Oracle中的正则表达式(REPLACE 和REGEXP_REPLACE)---转载自http://database.51cto.com/art/201009/228270.htm...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。