oracle:正則表達式


從oracle database 10gsql 開發指南中copy的。

 

正則表達式:

本節介紹正則表達式及相關的Oracle數據庫函數。使用這些函數可以在字符串中搜索字符模式。例如,假設有下列年份:

1965

1968

1971

1970

如果希望獲得1965年和1968年之間的年份(包括1965年和1968年),就可以使用下面的正則表達式實現這種功能:

^196[5-8]$

正則表達式中包含許多元字符(metacharacter)。在上面這個例子中,^、[5-8]以及$都是元字符。^可以匹配一個字符串的開頭;[5-8]可以匹配介於5~8之間的數字;$可以匹配一個字符串的結尾。因此,^196可以匹配以196開頭的字符串;[5-8]$可以匹配以5、6、7或8結尾的字符串。而^196[5-8]$就可以匹配1965、1966、1967和1968,這就是想要的結果。

在下面這個例子中,假設有如下字符串,其中引用了莎士比亞的《羅密歐與朱麗葉》中的一句台詞:

But, soft! What light through yonder window breaks?

如果想查找子字符串light,可以對引用的字符串應用下面的正則表達式:

l[[:alpha:]]{4}

在這個例子中,[[:alpha:]]和{4}都是元字符。[[:alpha:]]可以匹配A-Z或a-z之間的字符;{4}表示前面的匹配模式可以重復4次。當l、[[:alpha:]]和{4}一起使用時,可以匹配以 l 開頭的5個字母組成的序列。因此,當對這個字符串應用正則表達式 l[[:alpha:]]{4}時,就可以匹配子字符串light。

表4-7列出了在正則表達式中可以使用的部分元字符,同時還給出了這些元字符的意思以及使用這些元字符的簡單例子。

表4-7  正則表達式中的元字符

元  字  符

意    思

例    子

\

說明要匹配的字符是一個特殊字符、常量或者反向引用。(反向引用重復上一次匹配。)

\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是一個整數

hob{2}it 可以匹配hobbit

 

(續表)  

元  字  符

意    思

例    子

{n,m}

匹配一個字符至少n次,最多m次,其中n和m都是整數

hob{2,3}it 只能匹配hobbit和hobbbit

.

匹配除null之外的任意單個字符

hob.it 可以匹配hobait、hobbit等等

(pattern)

匹配指定模式的一個子表達式。可以使用子表達式構成復雜的正則表達式。在這種子表達式中,可以訪問單次的匹配,稱為捕獲(capture)

anatom(y|ies) 可以匹配anatomy和 anatomies

x|y

匹配x或y,其中x和y是一個或多個字符

war|peace 可以匹配 war 或 peace

[abc]

匹配中括號內的任意一個字符

[ab]bc 可以匹配 abc 和 bbc

[a-z]

匹配指定范圍內的任意一個字符

[a-c]bc 可以匹配 abc、bbc和cbc

[: :]

指定一個字符類,可以匹配該類中的任何字符

[:alphanum:] 可以匹配字符0-9、A-Z和a-z

[:alpha:] 可以匹配字符A-Z和a-z

[:blank:] 可以匹配空格或tab鍵

[:digit:] 可以匹配數字 0-9

[:graph:] 可以匹配非空字符

[:lower:] 可以匹配小寫字母a-z

[:print:] 與 [:graph:] 類似,不同之處在於[:print:] 包括空格字符

[:punct:] 可以匹配標點符號.,'''等等

[:space:] 可以匹配所有的空白字符

[:upper:] 可以匹配所有的大寫字母A~Z

[:xdigit:] 可以匹配十六進制數字 0~9、A~F和a~f

[..]

匹配一個組合元素,例如多字符元素

[==]

指定等價類

\n

這是對前一次捕獲的一個反向引用,其中n是一個正整數

(.)\1 可以匹配兩個連續相同的字符。(.)可以匹配除null之外的任何單個字符,而 \1 則重復上次匹配的內容,即再次匹配相同的字符,因此可以匹配兩個連續相同的字符

       

 

Oracle Database10gRelease 2新增加了很多類似於Perl的元字符,如表4-8所示。

表4-8  類似於Perl的元字符

元  字  符

含    義

\d

數字字符

\D

非數字字符

\w

字母字符

\W

非字母字符

\s

空白字符

\S

非空白字符

 

(續表)  

元  字  符

含    義

\A

只匹配字符串的開頭位置

\Z

只匹配字符串的末尾位置或者字符串末尾的換行符之前的位置

*?

匹配前面的模式元素0次或多次

+?

匹配前面的模式元素1次或多次

??

匹配前面的模式元素0次或1次

{n}

匹配前面的模式元素恰好n次

{n,}

匹配前面的模式元素至少n次

{n,m}

匹配前面的模式元素至少n次,但不超過m次

 

表4-9列出了正則表達式函數。正則表達式函數是在Oracle Database10g中新增加的, Oracle Database11g中又增加了一些條目,如下表所示。

表4-9  正則表達式函數

函    數

說    明

REGEXP_LIKE( x, pattern

 [, match_option])

從x中搜索pattern參數中定義的正則表達式。可以使用match_option修改默認匹配選項,該參數可以被設置為:

•  'c',說明在匹配時區分大小寫(默認選項)

•  'I',說明在匹配時不區分大小寫

•  'n',允許使用可以匹配任意字符的操作符

•  'm',將x作為一個包含多行的字符串

REGEXP_INSTR( x, pattern

 [, start

 [, occurrence

 [, return_option

 [, match_option

[, subexp_option]]]])

在x中查找pattern,並返回pattern所在的位置。可以指定以下的可選參數:

•  start 開始查找的位置。默認值是1,指x的第一個字符。

•  occurrence 說明應該返回第幾次出現pattern的位置。默認值是1,這意味着函數返回pattern第一次在x中出現的位置。

•  return_option 說明應該返回什么整數。若該參數為0,則說明要返回的整數是x中的第一個字符的位置;若該參數為非0的整數,則說明要返回的整數為x中出現在pattern之后的字符的位置

• match_option 修改默認的匹配設置,其工作方式與REGEXP_LIKEK()中指定的方式相同。

•  subexp_option是Oracle Database 11g新增加的,其工作方式如下:對於具有子表達式的模式,subexp_option是0~9之間的一個非負數,指出pattern中的哪個子表達式是函數的目標。例如,考慮表達式0123(((abc)(de)f)ghi)45(678),此表達式有5個子表達式,分別是:"abcdefghi"、"abcdef"、"abc"、"de"和"678"。
如果subexp_option是0,則返回pattern的位置。如果pattern沒有正確的子表達式數字,則函數返回0。subexp_option為空值則返回空。subexp_option的默認值是0

 

(續表)  

函    數

說    明

REGEXP_REPLACE(x, pattern

 [, replace_string

 [, start

 [, occurrence

 [, match_option]]]])

在x中查找pattern,並將其替換為replace_string。其他選項的意思與 REGEXP_INSTR()函數的參數完全相同

REGEXP_SUBSTR( x, pattern

 [, start

 [, occurrence

 [, match_option

[, subexp_option]]]])

返回x中可以匹配pattern的一個子字符串,其開始位置由start指定。其他選項的意思與 REGEXP_INSTR()函數的參數完全相同。Oracle Database11g新增加的subexp_option其工作方式與REGEXP_INSTR()函數中相同

REGEXP_COUNT( x, pattern

 [, start

 [, match_option]])

 

這是Oracle Database11g新增加的一個函數。在x中查找pattern,並返回pattern在x中出現的次數。可以提供以下兩個可選參數:

•  start 開始查找的位置。默認值是1,指x的第一個字符。

•  match_option 修改默認的匹配設置,其工作方式與REGEXP_LIKEK()中相同

 

接下來的幾節將會介紹更多有關正則表達式函數的知識。

1. REGEXP_LIKE()

REGEXP_LIKE(x, pattern [, match_option])用於在x中查找pattern參數中定義的正則表達式,該函數還可以提供一個可選參數match_option,它可以設置為下面幾個字符之一:

  • 'c',說明在匹配時區分大小寫(默認選項)
  • 'I',說明在匹配時不區分大小寫
  • 'n',允許使用可以匹配任意字符的操作符
  • 'm',將x 作為一個包含多行的字符串

下面這個查詢使用REGEXP_LIKE函數檢索生日在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

----------- ---------- ---------- ---------

                 1 John               Brown        01-JAN-65

                 2 Cynthia            Green        05-FEB-68

下面這個查詢檢索名字以J或j開頭的顧客。注意傳遞給REGEXP_LIKE()的正則表達式是 ^j,匹配選項是i,這說明不區分大小寫,因此在本例中,^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

----------- ---------- ---------- ---------

                 1 John               Brown        01-JAN-65

2. REGEXP_INSTR()

REGEXP_INSTR(x, pattern [, start [, occurrence [, return_option [, match_option]]]])用於在x中查找pattern;REGEXP_INSTR()返回pattern出現的位置。匹配位置從1開始。

下面這個查詢使用REGEXP_INSTR函數返回匹配正則表達式 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的位置。

下面這個查詢返回第二次匹配正則表達式 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

----------

45

下面這個查詢使用REGEXP_INSTR函數返回第二次匹配字母 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函數將匹配正則表達式 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已經被替換為sound。

4. REGEXP_SUBSTR()

REGEXP_SUBSTR(x, pattern[, start [, occurrence[, match_option]]])用於在x中查找匹配pattern的子字符串,開始位置由 start指定。

下面這個查詢使用REGEXP_SUBSTR函數返回匹配正則表達式 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 Database11g新增加的一個函數。REGEXP_COUNT(x, pattern[, start [,match_option]])用於在x中查找pattern,並返回pattern在x中出現的次數。可以提供可選參數start,指出要從x中開始查找pattern的那個字符;也可以提供可選的match_option字符串,指出匹配選項。

下面這個查詢使用REGEXP_COUNT函數返回正則表達式s[[:alpha:]]{3}出現的次數:

SELECT

 REGEXP_COUNT('But, soft! What light through yonder window softly breaks?',

  's[[:alpha:]]{3}') AS result

FROM dual;

 

    RESULT

----------

         2

注意返回結果是2,這表明正則表達式在提供的字符串中有兩次匹配。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM