REPLACE 函數是用另外一個值來替代串中的某個值。例如,可以用一個匹配數字來替代字母的每一次出現。REPLACE 的格式如下所示:
REPLACE?(?char,?search_string?[,?replace_string])?如果沒有指定replace_string 變量的值,那么當發現search_string 變量的值時,就將其刪除。輸入可以為任何字符數據類型——CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB或NCLOB。下面是一個示例:
REPLACE('GEORGE',?'GE',?'EG')?=?EGOREG ?REPLACE('GEORGE',?'GE',?NULL)?=?OR?如果搜索串的長度不為零,則可以知道搜索串在某個串中出現的次數。首先,計算源串的長度:
LENGTH('GEORGE')?然后,計算源串刪除搜索串以后的長度:
LENGTH(REPLACE('GEORGE',?'GE',?NULL))?接著用搜索串的長度除以兩次的長度之差,就可以得到搜索串出現的次數:
select?LENGTH('GEORGE') ?-?LENGTH(REPLACE('GEORGE',?'GE',?NULL)) ?/ ?LENGTH('GE')?AS?Counter ?from?DUAL; ?COUNTER ?-------?REGEXP_REPLACE 函數在幾個方面擴展了REPLACE 函數的功能。它支持在搜索模式中使用正則表達式,也支持本章前面描述的變量,即position、occurrence 和match_parameter,從而可以選擇只替代某些匹配的值,或者不區分大小寫。REGEXP_REPLACE 函數的語法如下所示:
REGEXP_REPLACE(?source_string,?pattern ?[,?replace_string ?[,?position ?[,?occurrence ?[,?match_parameter?] ?] ?] ?] ?)?除了replace_string,這里所有的變量都已經在本章前面章節作了介紹。replace_string 告訴Oracle 用什么來替代source_string 中與pattern 匹配的部分。occurrence 變量是一個非負整數,它指定操作的次數:如果為0,則所有的匹配項都被替代;如果指定一個正數,則Oracle替代第n 次匹配。
考慮ADDRESS 表中的Phone 列。首先,尋找格式為###-###-#### 的號碼。該格式分為3 部分,分別是3 個數字的集合、后面是另3 個數字的一個集合,然后又是4 個數字的一個集合,中間用‘-’符號隔開。通過在REGEXP_SUBSTR 函數調用中查找那些數字集合,可以找到與該標準匹配的行:
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?現在,使用REGEXP_REPLACE 把前3 個數字放在圓括號內,同時省略第一個‘-’符號。為此,我們將第1 個數字集稱為 \1,第2 個數據集稱為 \2,第3 個數據集稱為\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?輸出說明了REGEXP_REPLACE 函數調用的結果,即區號用圓括號括起來,第一個'-'被去掉。
為了說明occurrenc 變量的工作原理,下面的REGEXP_REPLACE 函數調用是用句點來替代電話號碼中的第二個'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?可以進一步修改該查詢語句,排除前3 個可能匹配的數字(開始位置設為4),并替代第4次出現:
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?通過在where 子句中使用REGEXP_INSTR,可以限制返回的行。在本例中,只顯示那些至少含有4 個‘5’的行(從第4 個字符開始)。因為該搜索模式并不復雜,所以這里也可以使用INSTR 函數。
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.?可以使用該功能來搜索可供選擇的值,從而在單個查詢中組合使用多個查詢標準。在下面的示例中,可以替代5 或者2;‘5’和‘2’的出現次數都記入occurrence 統計量中:
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?由于該示例中出現的‘|’符號是一個可選的運算符,因此,匹配兩個指定值中任何一個都將返回一行。關于正則表達式中支持的更多運算符,請參閱表8-1。
轉載于:https://www.cnblogs.com/maowh/p/3711656.html
總結
以上是生活随笔為你收集整理的Oracle中的正则表达式(REPLACE 和REGEXP_REPLACE)---转载自http://database.51cto.com/art/201009/228270.htm...的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。