您好,登錄后才能下訂單哦!
本篇文章為大家展示了oracle10g數據庫中如何使用正則表達式,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
如果有一個字符串 aabcd ,并指定了一個 a(b|c)d 搜索,則將搜索后跟 b 或 c ,接著是 d 的 a 。
正則表達式: 'a(b|c)d' 匹配的字符串: 'aabcd' |
a | a | b | c | d | 說明 | 結果 |
* | 搜索 a 并成功 | 匹配 | ||||
* | 搜索 b 但失敗 | 不匹配 | ||||
* | 搜索 c 但失敗,重置并繼續搜索 | 不匹配 | ||||
* | 搜索 a 并成功 | 匹配 | ||||
* | 搜索 b 并成功;將 c 記憶為一個選擇項 | 匹配 | ||||
* | 搜索 d 但失敗 | 不匹配 | ||||
* | 搜索作為上次記憶的選擇項的 c 但失敗,重置并繼續搜索 | 不匹配 | ||||
* | 搜索 a 但失敗,重置并繼續搜索 | 不匹配 | ||||
* | 搜索 a 但失敗,重置并繼續搜索 | 不匹配 | ||||
* | 搜索 a 但失敗,重置并繼續搜索 | 不匹配 |
a(b|c)d 不匹配給定的字符串 aabcd 。
要在 SQL 或 PL/SQL 中實現正則表達式支持,需要使用一組新函數。這些函數是:
函數名 | 說明 |
REGEXP_LIKE | 類似于 LIKE 運算符,但執行正則表達式匹配而不是簡單的模式匹配 |
REGEXP_INSTR | 在給定字符串中搜索某個正則表達式模式,并返回匹配項的位置。 |
REGEXP_REPLACE | 搜索某個正則表達式模式并使用替換字符串替換它 |
REGEXP_SUBSTR | 在給定字符串中搜索某個正則表達式模式并返回匹配的子字符串 |
元字符
元字符是具有特殊意義的字符,如通配符字符、重復字符、非匹配字符或一個字符范圍。
可以在與函數匹配的模式中使用多個預定義的元字符符號。
符號 | 說明 |
* | 匹配零個或多個匹配項 |
| | 用于指定選擇性匹配項的選擇性運算符 |
^/$ | 匹配行的開頭和結尾 |
[] | 用于匹配列表(匹配該列表中的任何表達式)的方括號表達式 |
[^exp] | 如果脫字符位于方括號內部,則對表達式取非。 |
{m} | 精確匹配 m 次 |
{m,n} | 至少匹配 m 次,但不超過 n 次 |
[: :] | 指定一個字符類并匹配該類中的任何字符 |
\ | 可以有四種不同的含義:(1) 表示其自身;(2) 引用下一個字符;(3) 引入一個運算符;(4) 不執行任何操作 |
+ | 匹配一個或多個匹配項 |
? | 匹配零個或一個匹配項 |
. | 匹配所支持字符集中的任何字符(NULL 除外) |
() | 對表達式進行分組(視作一個子表達式) |
\n | 向后引用表達式 |
[==] | 指定等價類 |
[..] | 指定一個對照元素(如多字符元素) |
使用基本搜索
以下示例演示了正則表達式函數的用法。執行以下步驟:
1. | 在終端窗口中,切換到 /home/oracle/wkdir 目錄并啟動 SQL*Plus。 使用用戶 ID oe/oe 和口令 oe/oe 連接到 Oracle。 cd /home/oracle/wkdirsqlplus oe/oe
|
2. | 檢查 REGEXP_LIKE 函數的語法: REGEXP_LIKE(srcstr, pattern [,match_option]) 在此函數中: srcstr:搜索值 “c”:使用區分大小寫的匹配(默認值) 要找到 PRODUCT_INFORMATION 表的 PRODUCT_NAME 列中名稱包含 SSP/S、SSP/V、SSS/V 或 SSS/S 的所有產品,請執行以下腳本: @relike.sql relike.sql 腳本包含以下 SQL: SELECT product_nameFROM oe.product_informationWHERE regexp_like (product_name, 'SS[PS]/[VS]');
|
3. | REGEXP_INSTR 函數返回字符串中給定模式的位置。檢查語法: REGEXP_INSTR(srcstr, pattern [, position [, occurrence[, return_option [, match_option]]]]) 在該函數中: position:搜索起始位置 “c”:使用區分大小寫的匹配(默認值) 要搜索產品名稱以確定第一個非字母字符(無論其是大寫還是小寫)的位置,請執行以下腳本: @reinstr.sql reinstr.sql 腳本包含以下 SQL: COLUMN non_alpha FORMAT 9999999999 請注意, [^[:<class>:]] 表示一個字符類,并匹配該類中的任何字符; [:alpha:] 匹配任何字母字符。在本示例中,您將通過使用 ^ 對該表達式取非。
|
4. | REGEXP_SUBSTR 函數根據匹配項的模式返回給定字符串。檢查語法: REGEXP_SUBSTR(srcstr, pattern [, position[, occurrence [, match_option]]]) 在該函數中: position:搜索起始位置 “c”:使用區分大小寫的匹配(默認值) 要從 CUSTOMERS 表中提取電子郵件名,只提取位于瑞士的客戶的電子郵件名。為此,返回 CUST_EMAIL 列(該列在客戶的 @ 符號前的 NLS_TERRITORY 等于 Switzerland)中的內容。執行以下腳本: @resubstr.sql resubstr.sql 腳本包含以下 SQL: SELECT REGEXP_SUBSTR(cust_email, '[^@]+') 請注意,在本示例中,結果返回第一個沒有 @ 符號的子字符串。
|
5. | EGEXP_REPLACE 函數返回給定字符串中的“已替換的”子字符串。檢查語法: REGEXP_REPLACE(srcstr, pattern [,replacestr [, position[, occurrence [, match_option]]]]) 在該函數中: position:搜索起始位置 “c”:使用區分大小寫的匹配(默認值) 要返回 PRODUCT_INFORMATION 表的 CATALOG_URL 列中的信息,可以對該列執行完全掃描。但這將導致返回上百個行,這是因為它列出了多個目錄域中的特定 HTML 頁面位置。但在該示例中,您只想要查找單個域名本身,而不是它們所包含的低級頁面。要查找不包含所有不必要信息的域名,請使用 REGEXP_REPLACE 函數。執行以下腳本: @rereplace.sql rereplace.sql 腳本包含以下 SQL: SELECT UNIQUE REGEXP_REPLACE (catalog_url, 'http://([^/]+).*', '\1') 以下是有關如何處理字符串的介紹: http://該表達式首先查找該字符串文字;此處沒有特殊的元字符。([^/]+)然后,該表達式搜索一系列字符(只要它們不是斜線 (/))。.*該表達式在用該部分遍歷該字符串的剩余部分時結束。\1匹配表達式替換為后向引用 1,它是在第一組括號中匹配的任何內容。
|
使用多語言功能
正則表達式函數支持多語言功能,并可以用于對區域設置敏感的應用程序。要將正則表達式與 Oracle 的 NLS 語言特性組合使用,請執行以下步驟:
1. | 執行以下腳本以查找用葡萄牙語表示的產品描述: @multiport.sql multiport.sql 腳本包含以下 SQL: SELECT regexp_substr(to_char(translated_name), '^[a-z]+')FROM oe.product_descriptionsWHERE language_id = 'PT'AND translated_name like 'G%' ; 請注意,未顯示該數據。 ^ 位于方括號外部,這意味著您將搜索以任何字符(從 a 到 z)開頭的任何字符串或子字符串。
|
2. | 執行同一查詢,但這次使用已區分大小寫的“i”。執行以下腳本: @multiport2.sql multiport2.sql 腳本包含以下 SQL: SELECT regexp_substr(to_char(translated_name), '^[a-z]+', 1, 1, 'i')FROM oe.product_descriptionsWHERE language_id = 'PT'AND translated_name like 'G%' ;
|
3. | 由于在遇到非英文字符時,返回的字符串被截斷,因此結果仍不完整。這是因為范圍 [a-z] 對 NLS_LANGUAGE 比較敏感。因此,需要相應地設置 NLS_LANGUAGE 參數,以返回完整結果。執行以下查詢: @multiport3.sql multiport3.sql 腳本包含以下 SQL: ALTER SESSION SET NLS_LANGUAGE=PORTUGUESE;SELECT regexp_substr(to_char(translated_name), '^[a-z]+', 1, 1, 'i')FROM oe.product_descriptionsWHERE language_id = 'PT'AND translated_name like 'G%' ;
|
4. | 最后一步是查看用英語和葡萄牙語表示的結果以確保已經完成了翻譯。執行以下腳本: @multiport4.sql multiport4.sql 腳本包含以下 SQL: SELECT REGEXP_SUBSTR(i.product_name, '^[a-z]+', 1, 1, 'i') || ' = '
|
返回主題列表
正則表達式和校驗約束
要在校驗約束中使用正則表達式,請執行以下步驟:
1. | 在 CUSTOMERS 表的 CUST_EMAIL 列上添加一個校驗約束可以確保只接受包含 @ 符號的字符串。執行以下腳本: @chkemail.sql chkemail.sql 腳本包含以下 SQL: INSERT INTO customers VALUES(9999,'Christian','Patel', cust_address_typ ('1003 Canyon Road','87501','Santa Fe','NM','US'), phone_list_typ ('+1 505 243 4144'),'us','AMERICA','100', 'ChrisP+creme.com', 149, null, null, null, null, 由于未執行驗證,因此接受了未包含 @ 符號的電子郵件地址。在開始進行下個步驟之前執行回滾。 ROLLBACK;
|
2. | 通過執行以下腳本實施約束: @chkemail2.sql chkemail2.sql 腳本包含以下 SQL: ALTER TABLE customersADD CONSTRAINT cust_email_addrCHECK(REGEXP_LIKE(cust_email,'@'))NOVALIDATE ;
|
3. | 再次執行 @chkemail.sql 測試該約束。 由于電子郵件地址不包含要求的符號,因此它違反了校驗約束。NOVALIDATE 子句確保不檢查現有數據。
|
4. | 通過執行以下腳本刪除約束: @chkemail3.sql chkemail3.sql 腳本包含以下 SQL: ALTER TABLE customers DROP CONSTRAINT cust_email_addr ;
后向引用 正則表達式的一個有用的特性是能夠存儲子表達式供以后重用;這也被稱為后向引用(在表 10 中對其進行了概述)。它允許復雜的替換功能,如在新的位置上交換模式或顯示重復出現的單詞或字母。子表達式的匹配部分保存在臨時緩沖區中。緩沖區從左至右進行編號,并利用 接下來的例子顯示了通過按編號引用各個子表達式將姓名 Ellen Hildi Smith 轉變為 Smith, Ellen Hildi 。 SELECT REGEXP_REPLACE( 該 SQL 語句顯示了用圓括號括住的三個單獨的子表達式。每一個單獨的子表達式包含一個匹配元字符 (. ),并緊跟著* 元字符,表示任何字符(除換行符之外)都必須匹配零次或更多次。空格將各個子表達式分開,空格也必須匹配。圓括號創建獲取值的子表達式,并且可以用 \digit 來引用。第一個子表達式被賦值為 \1 ,第二個 \2 ,以此類推。這些后向引用被用在這個函數的最后一個參數 (\3, \1 \2 ) 中,這個函數有效地返回了替換子字符串,并按期望的格式來排列它們(包括逗號和空格)。表 后向引用對替換、格式化和代替值非常有用,并且您可以用它們來查找相鄰出現的值。接下來的例子顯示了使用REGEP_SUBSTR 函數來查找任意被空格隔開的重復出現的字母數字值。顯示的結果給出了識別重復出現的單詞 is 的子字符串。 SELECT REGEXP_SUBSTR( 匹配參數選項 您可能已經注意到了正則表達式操作符和函數包含一個可選的匹配參數。這個參數控制是否區分大小寫、換行符的匹配和保留多行輸入。 正則表達式的實際應用 您不僅可以在隊列中使用正則表達式,還可以在使用 SQL 操作符或函數的任何地方(比如說在 PL/SQL 語言中)使用正則表達式。您可以編寫利用正則表達式功能的觸發器,以驗證、生成或提取值。 接下來的例子演示了您如何能夠在一次列檢查約束條件中應用 REGEXP_LIKE 操作符來進行數據驗證。它在插入或更新時檢驗正確的社會保險號碼格式。如 123-45-6789 和 123456789 之類格式的社會保險號碼對于這種列約束條件是可接受的值。有效的數據必須以三個數字開始,緊跟著一個連字符,再加兩個數字和一個連字符,最后又是四個數 字。另一種表達式只允許 9 個連續的數字。豎線符號 (| ) 將各個選項分開。
ALTER TABLE students ADD CONSTRAINT stud_ssn_ck CHECK (REGEXP_LIKE(ssn, '^([[:digit:]]{3}-[[:digit:]]{2}-[[:digit:]]{4}|[[:digit:]]{9})$')) 由 ^ 和 $ 指示的開頭或結尾的字符都是不可接受的。確保您的正則表達式沒有分成多行或包含任何不必要的空格,除非您希望格式如此并相應地進行匹配。表 將正則表達式與現有的功能進行比較 正則表達式有幾個優點優于常見的 LIKE 操作符和INSTR、SUBSTR 及 REPLACE 函數的。這些傳統的 SQL 函數不便于進行模式匹配。只有 LIKE 操作符通過使用 % 和_ 字符匹配,但 LIKE 不支持表達式的重復、復雜的更替、字符范圍、字符列表和 POSIX 字符類等等。此外,新的正則表達式函數允許檢測重復出現的單詞和模式交換。這里的例子為您提供了正則表達式領域的一個概覽,以及您如何能夠在您的應用程序中使用它們。 實實在在地豐富您的工具包 因為正則表達式有助于解決復雜的問題,所以它們是非常強大的。正則表達式的一些功能難于用傳統的 SQL 函數來仿效。當您了解了這種稍顯神秘的語言的基礎構建程序塊時,正則表達式將成為您的工具包的不可缺少的一部分(不僅在 SQL 環境下也在其它的編程語言環境下)。為了使您的各個模式正確,雖然嘗試和錯誤有時是必須的,但正則表達式的簡潔和強大是不容置疑的。 Alice Rischert (ar280@yahoo.com ) 是哥倫比亞大學計算機技術與應用系的數據庫應用程序開發和設計方向的主席。她編寫了 Oracle 表 1:定位元字符 元字符說明^使表達式定位至一行的開頭$使表達式定位至一行的末尾表 2:量詞或重復操作符 量詞說明*匹配 0 次或更多次?匹配 0 次或 1 次+匹配 1 次或更多次{m}正好匹配 m 次{m,}至少匹配 m 次{m, n}至少匹配 m 次但不超過 n 次表 3:預定義的 POSIX 字符類 字符類說明[:alpha:]字母字符[:lower:]小寫字母字符[:upper:]大寫字母字符[:digit:]數字[:alnum:]字母數字字符[:space:]空白字符(禁止打印),如回車符、換行符、豎直制表符和換頁符[:punct:]標點字符[:cntrl:]控制字符(禁止打印)[:print:]可打印字符表 4:表達式的替換匹配和分組 元字符說明|替換分隔替換選項,通常與分組操作符 () 一起使用( )分組將子表達式分組為一個替換單元、量詞單元或后向引用單元(參見“后向引用 ”部分)[char]字符列表表示一個字符列表;一個字符列表中的大多數元字符(除字符類、^ 和 - 元字符之外)被理解為文字表 5:REGEXP_LIKE 操作符 語法說明REGEXP_LIKE(source_string, pattern[, match_parameter])source_string 支持字符數據類型(CHAR、VARCHAR2、CLOB、NCHAR、NVARCHAR2 和 NCLOB ,但不包括 LONG )。pattern 參數是正則表達式的另一個名稱。match_parameter 允許可選的參數(如處理換行符、保留多行格式化以及提供對區分大小寫的控制)。表 6:REGEXP_INSTR 函數 語法說明REGEXP_INSTR(source_string, pattern[, start_position[, occurrence[, return_option[, match_parameter]]]])該函數查找 pattern ,并返回該模式的第一個位置。您可以隨意指定您想要開始搜索的start_position 。 occurrence 參數默認為 1,除非您指定您要查找接下來出現的一個模式。return_option 的默認值為 0,它返回該模式的起始位置;值為 1 則返回符合匹配條件的下一個字符的起始位置。表 7: 5 位數字加 4 位郵政編碼表達式的說明 語法說明 必須匹配的空白[:digit:]POSIX 數字類]字符列表的結尾{5}字符列表正好重復出現 5 次(子表達式的開頭-一個文字連字符,因為它不是一個字符列表內的范圍元字符[字符列表的開頭[:digit:]POSIX [:digit:] 類[字符列表的開頭]字符列表的結尾{4}字符列表正好重復出現 4 次)結束圓括號,結束子表達式?? 量詞匹配分組的子表達式 0 或 1 次,從而使得 4 位代碼可選$定位元字符,指示行尾表 8:REGEXP_SUBSTR 函數 語法說明REGEXP_SUBSTR(source_string, pattern[, position [, occurrence[, match_parameter]]])REGEXP_SUBSTR 函數返回匹配模式的子字符串。表 9: REGEXP_REPLACE 函數 語法說明REGEXP_REPLACE(source_string, pattern[, replace_string [, position[,occurrence, [match_parameter]]]])該函數用一個指定的 replace_string 來替換匹配的模式,從而允許復雜的“搜索并替換”操作。表 10:后向引用元字符 元字符說明\digit反斜線緊跟著一個 1 到 9 之間的數字,反斜線匹配之前的用括號括起來的第 digit 個子表達式。(注意:反斜線在正則表達式中有另一種意義,取決于上下文,它還可能表示 Escape 字符。表 11:模式交換正則表達式的說明 正則表達式項目說明(第一個子表達式的開頭.匹配除換行符之外的任意單字符*重復操作符,匹配之前的 . 元字符 0 到 n 次)第一個子表達式的結尾;匹配結果在 \1 中獲取(在這個例子中,結果為 Ellen 。) 必須存在的空白(第二個子表達式的開頭.匹配除換行符之外的任意單個字符*重復操作符,匹配之前的 . 元字符 0 到 n 次)第二個子表達式的結尾;匹配結果在 \2 中獲取(在這個例子中,結果為 Hildi 。) 空白(第三個子表達式的開頭.匹配除換行符之外的任意單字符*重復操作符,匹配之前的 . 元字符 0 到 n 次)第三個子表達式的結尾;匹配結果在 \3 中獲取(在這個例子中,結果為 Smith 。)表 12:社會保險號碼正則表達式的說明 正則表達式項目說明^行首字符(正則表達式在匹配之前不能有任何前導字符。)(開始子表達式并列出用 | 元字符分開的可替換選項[字符列表的開頭[:digit:]POSIX 數字類]字符列表的結尾{3}字符列表正好重復出現 3 次-連字符[字符列表的開頭[:digit:]POSIX 數字類]字符列表的結尾{2}字符列表正好重復出現 2 次-另一個連字符[字符列表的開頭[:digit:]POSIX 數字類]字符列表的結尾{4}字符列表正好重復出現 4 次|替換元字符;結束第一個選項并開始下一個替換表達式[字符列表的開頭[:digit:]POSIX 數字類]字符列表的結尾{9}字符列表正好重復出現 9 次)結束圓括號,結束用于替換的子表達式組$定位元字符,指示行尾;沒有額外的字符能夠符合模式 |
上述內容就是oracle10g數據庫中如何使用正則表達式,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。