oracle中如何使用正則函數(shù),很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)公司為您提適合企業(yè)的網(wǎng)站設(shè)計?讓您的網(wǎng)站在搜索引擎具有高度排名,讓您的網(wǎng)站具備超強的網(wǎng)絡(luò)競爭力!結(jié)合企業(yè)自身,進行網(wǎng)站設(shè)計及把握,最后結(jié)合企業(yè)文化和具體宗旨等,才能創(chuàng)作出一份性化解決方案。從網(wǎng)站策劃到成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè), 我們的網(wǎng)頁設(shè)計師為您提供的解決方案。
使用這些函數(shù)可以在字符串中搜索字符模式。例如,假設(shè)有下列年份:
1965 1968 1971 1970 |
如果希望獲得1965年和1968年之間的年份(包括1965年和1968年),就可以使用下面的正則表達式實現(xiàn)這種功能:
^196[5-8]$ |
正則表達式中包含許多元字符(metacharacter)。在上面這個例子中,^、[5-8]以及$都是元字符。^可以匹配一個字符串的開頭;[5-8]可以匹配介于5~8之間的數(shù)字;$可以匹配一個字符串的結(jié)尾。因此,^196可以匹配以196開頭的字符串;[5-8]$可以匹配以5、6、7或8結(jié)尾的字符串。而^196[5-8]$就可以匹配1965、1966、1967和1968,這就是想要的結(jié)果。
在下面這個例子中,假設(shè)有如下字符串,其中引用了莎士比亞的《羅密歐與朱麗葉》中的一句臺詞:
But, soft! What light through yonder window breaks? |
如果想查找子字符串light,可以對引用的字符串應(yīng)用下面的正則表達式:
l[[:alpha:]]{4} |
在這個例子中,[[:alpha:]]和{4}都是元字符。[[:alpha:]]可以匹配A-Z或a-z之間的字符;{4}表示前面的匹配模式可以重復(fù)4次。當(dāng)l、[[:alpha:]]和{4}一起使用時,可以匹配以 l 開頭的5個字母組成的序列。因此,當(dāng)對這個字符串應(yīng)用正則表達式 l[[:alpha:]]{4}時,就可以匹配子字符串light。
表4-7列出了在正則表達式中可以使用的部分元字符,同時還給出了這些元字符的意思以及使用這些元字符的簡單例子。
表4-7 正則表達式中的元字符
元 字 符 | 意 思 | 例 子 |
\ | 說明要匹配的字符是一個特殊字符、常量或者反向引用。(反向引用重復(fù)上一次匹配。) | \n 匹配換行符 \\ 匹配 \ \( 匹配( \) 匹配) |
^ | 匹配字符串的開頭位置 | 如果A是字符串中的第一個字符,^A 匹配A |
$ | 匹配字符串的末尾位置 | 如果B是字符串中的最后一個字符,$B匹配B |
* | 匹配前面的字符0次或多次。 | ba*rk 可以匹配 brk、bark、baark等等 |
+ | 匹配前面的字符1次或多次。 | ba+rk 可以匹配bark、baark等等,但是不能匹配brk |
? | 匹配前面的字符0次或1次 | ba?rk 只能匹配brk和bark |
{n} | 匹配一個字符恰好n次,其中n是一個整數(shù) | hob{2}it 可以匹配hobbit |
(續(xù)表)
元 字 符 | 意 思 | 例 子 | |
{n,m} | 匹配一個字符至少n次,最多m次,其中n和m都是整數(shù) | hob{2,3}it 只能匹配hobbit和hobbbit | |
. | 匹配除null之外的任意單個字符 | hob.it 可以匹配hobait、hobbit等等 | |
(pattern) | 匹配指定模式的一個子表達式??梢允褂米颖磉_式構(gòu)成復(fù)雜的正則表達式。在這種子表達式中,可以訪問單次的匹配,稱為捕獲(capture) | anatom(y|ies) 可以匹配anatomy和anatomies | |
x|y | 匹配x或y,其中x和y是一個或多個字符 | war|peace 可以匹配 war 或 peace | |
[abc] | 匹配中括號內(nèi)的任意一個字符 | [ab]bc 可以匹配 abc 和 bbc | |
[a-z] | 匹配指定范圍內(nèi)的任意一個字符 | [a-c]bc 可以匹配 abc、bbc和cbc | |
[: :] | 指定一個字符類,可以匹配該類中的任何字符 | [:alphanum:] 可以匹配字符0-9、A-Z和a-z [:alpha:] 可以匹配字符A-Z和a-z [:blank:] 可以匹配空格或tab鍵 [:digit:] 可以匹配數(shù)字 0-9 [:graph:] 可以匹配非空字符 [:lower:] 可以匹配小寫字母a-z [:print:] 與 [:graph:] 類似,不同之處在于[:print:] 包括空格字符 [:punct:] 可以匹配標(biāo)點符號.,'''等等 [:space:] 可以匹配所有的空白字符 [:upper:] 可以匹配所有的大寫字母A~Z [:xdigit:] 可以匹配十六進制數(shù)字0~9、A~F和a~f | |
[..] | 匹配一個組合元素,例如多字符元素 | 無 | |
[==] | 指定等價類 | 無 | |
這是對前一次捕獲的一個反向引用,其中n是一個正整數(shù) | (.)\1 可以匹配兩個連續(xù)相同的字符。(.)可以匹配除null之外的任何單個字符,而 \1 則重復(fù)上次匹配的內(nèi)容,即再次匹配相同的字符,因此可以匹配兩個連續(xù)相同的字符 |
Oracle Database 10g Release 2新增加了很多類似于Perl的元字符,如表4-8所示。
表4-8 類似于Perl的元字符
元 字 符 | 含 義 |
\d | 數(shù)字字符 |
\D | 非數(shù)字字符 |
\w | 字母字符 |
\W | 非字母字符 |
\s | 空白字符 |
\S | 非空白字符 |
(續(xù)表)
元 字 符 | 含 義 |
\A | 只匹配字符串的開頭位置 |
\Z | 只匹配字符串的末尾位置或者字符串末尾的換行符之前的位置 |
*? | 匹配前面的模式元素0次或多次 |
+? | 匹配前面的模式元素1次或多次 |
?? | 匹配前面的模式元素0次或1次 |
{n} | 匹配前面的模式元素恰好n次 |
{n,} | 匹配前面的模式元素至少n次 |
{n,m} | 匹配前面的模式元素至少n次,但不超過m次 |
表4-9列出了正則表達式函數(shù)。正則表達式函數(shù)是在Oracle Database 10g中新增加的, Oracle Database 11g中又增加了一些條目,如下表所示。
表4-9 正則表達式函數(shù)
函 數(shù) | 說 明 |
REGEXP_LIKE( x, pattern [, match_option]) | 從x中搜索pattern參數(shù)中定義的正則表達式。可以使用match_option修改默認(rèn)匹配選項,該參數(shù)可以被設(shè)置為: ? 'c',說明在匹配時區(qū)分大小寫(默認(rèn)選項) ? 'I',說明在匹配時不區(qū)分大小寫 ? 'n',允許使用可以匹配任意字符的操作符 ? 'm',將x作為一個包含多行的字符串 |
REGEXP_INSTR( x, pattern [, start [, occurrence [, return_option [, match_option [, subexp_option]]]]) | 在x中查找pattern,并返回pattern所在的位置??梢灾付ㄒ韵碌目蛇x參數(shù): ? start 開始查找的位置。默認(rèn)值是1,指x的第一個字符。 ? occurrence 說明應(yīng)該返回第幾次出現(xiàn)pattern的位置。默認(rèn)值是1,這意味著函數(shù)返回pattern第一次在x中出現(xiàn)的位置。 ? return_option 說明應(yīng)該返回什么整數(shù)。若該參數(shù)為0,則說明要返回的整數(shù)是x中的第一個字符的位置;若該參數(shù)為非0的整數(shù),則說明要返回的整數(shù)為x中出現(xiàn)在pattern之后的字符的位置 ? match_option 修改默認(rèn)的匹配設(shè)置,其工作方式與REGEXP_LIKEK()中指定的方式相同。 ? subexp_option是Oracle Database 11g新增加的,其工作方式如下:對于具有子表達式的模式,subexp_option是0~9之間的一個非負(fù)數(shù),指出pattern中的哪個子表達式是函數(shù)的目標(biāo)。例如,考慮表達式0123(((abc)(de)f)ghi)45(678),此表達式有5個子表達式,分別是:"abcdefghi"、"abcdef"、"abc"、"de"和"678"。 |
(續(xù)表)
函 數(shù) | 說 明 |
REGEXP_REPLACE(x, pattern [, replace_string [, start [, occurrence [, match_option]]]]) | 在x中查找pattern,并將其替換為replace_string。其他選項的意思與 REGEXP_INSTR()函數(shù)的參數(shù)完全相同 |
REGEXP_SUBSTR( x, pattern [, start [, occurrence [, match_option [, subexp_option]]]]) | 返回x中可以匹配pattern的一個子字符串,其開始位置由start指定。其他選項的意思與 REGEXP_INSTR()函數(shù)的參數(shù)完全相同。Oracle Database 11g新增加的subexp_option其工作方式與REGEXP_INSTR()函數(shù)中相同 |
REGEXP_COUNT( x, pattern [, start [, match_option]])
| 這是Oracle Database 11g新增加的一個函數(shù)。在x中查找pattern,并返回pattern在x中出現(xiàn)的次數(shù)??梢蕴峁┮韵聝蓚€可選參數(shù): ? start 開始查找的位置。默認(rèn)值是1,指x的第一個字符。 ? match_option 修改默認(rèn)的匹配設(shè)置,其工作方式與REGEXP_LIKEK()中相同 |
接下來的幾節(jié)將會介紹更多有關(guān)正則表達式函數(shù)的知識。
1. REGEXP_LIKE()
REGEXP_LIKE(x, pattern [, match_option])用于在x中查找pattern參數(shù)中定義的正則表達式,該函數(shù)還可以提供一個可選參數(shù)match_option,它可以設(shè)置為下面幾個字符之一:
● 'c',說明在匹配時區(qū)分大小寫(默認(rèn)選項)
● 'I',說明在匹配時不區(qū)分大小寫
● 'n',允許使用可以匹配任意字符的操作符
● 'm',將x 作為一個包含多行的字符串
下面這個查詢使用REGEXP_LIKE函數(shù)檢索生日在1965年到1968年之間的顧客:
SELECT customer_id, first_name, last_name, dob FROM customers WHERE REGEXP_LIKE(TO_CHAR(dob, 'YYYY'), '^196[5-8]$'); CUSTOMER_ID FIRST_NAME LAST_NAME DOB |
下面這個查詢檢索名字以J或j開頭的顧客。注意傳遞給REGEXP_LIKE()的正則表達式是 ^j,匹配選項是i,這說明不區(qū)分大小寫,因此在本例中,^j 可以匹配J或j:
SELECT customer_id, first_name, last_name, dob FROM customers WHERE REGEXP_LIKE(first_name, '^j', 'i'); CUSTOMER_ID FIRST_NAME LAST_NAME DOB |
2. REGEXP_INSTR()
REGEXP_INSTR(x, pattern [, start [, occurrence [, return_option [, match_option]]]])用于在x中查找pattern;REGEXP_INSTR()返回pattern出現(xiàn)的位置。匹配位置從1開始。
下面這個查詢使用REGEXP_INSTR函數(shù)返回匹配正則表達式 l[[:alpha:]]{4}的位置:
SELECT REGEXP_INSTR('But, soft! What light through yonder window breaks?', 'l[[:alpha:]]{4}') AS result FROM dual; RESULT ---------- 17 |
注意返回值為17,這是light中l(wèi)的位置。
下面這個查詢返回第二次匹配正則表達式 s[[:alpha:]]{3}的位置,匹配位置從1開始:
SELECT REGEXP_INSTR('But, soft! What light through yonder window softly breaks?', 's[[:alpha:]]{3}', 1, 2) AS result FROM dual; RESULT |
下面這個查詢使用REGEXP_INSTR函數(shù)返回第二次匹配字母 o 的位置,匹配位置從10開始:
SELECT REGEXP_INSTR('But, soft! What light through yonder window breaks?', 'o', 10, 2) AS result FROM dual; RESULT ---------- 32 |
3. REGEXP_REPLACE()
REGEXP_REPLACE(x, pattern [, replace_string [, start [, occurrence[, match_option]]]])用于在x中查找pattern,并將其替換為 replace_string。
下面這個查詢使用REGEXP_REPLACE函數(shù)將匹配正則表達式 l[[:alpha:]]{4}的子字符串替換為字符串 sound:
SELECT REGEXP_REPLACE('But, soft! What light through yonder window breaks?', 'l[[:alpha:]]{4}', 'sound') AS result FROM dual; RESULT --------------------------------------------------- But, soft! What sound through yonder window breaks? |
注意light已經(jīng)被替換為sound。
4. REGEXP_SUBSTR()
REGEXP_SUBSTR(x, pattern[, start [, occurrence[, match_option]]])用于在x中查找匹配pattern的子字符串,開始位置由 start指定。
下面這個查詢使用REGEXP_SUBSTR函數(shù)返回匹配正則表達式 l[[:alpha:]]{4}的子字符串:
SELECT REGEXP_SUBSTR('But, soft! What light through yonder window breaks?', 'l[[:alpha:]]{4}') AS result FROM dual; RESUL ----- light |
5. REGEXP_COUNT()
REGEXP_COUNT()是Oracle Database 11g新增加的一個函數(shù)。REGEXP_COUNT(x, pattern[, start [,match_option]])用于在x中查找pattern,并返回pattern在x中出現(xiàn)的次數(shù)??梢蕴峁┛蛇x參數(shù)start,指出要從x中開始查找pattern的那個字符;也可以提供可選的match_option字符串,指出匹配選項。
下面這個查詢使用REGEXP_COUNT函數(shù)返回正則表達式s[[:alpha:]]{3}出現(xiàn)的次數(shù):
SELECT REGEXP_COUNT('But, soft! What light through yonder window softly breaks?', 's[[:alpha:]]{3}') AS result FROM dual; RESULT ---------- 2 |
注意返回結(jié)果是2,這表明正則表達式在提供的字符串中有兩次匹配。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。