Oracle數(shù)據(jù)庫中使用正則表達(dá)式的超詳細(xì)教程
0. 引言
本文介紹 Oracle 數(shù)據(jù)庫的正則表達(dá)式支持。本文涵蓋以下主題:
- 什么是正則表達(dá)式?
- Oracle 數(shù)據(jù)庫正則表達(dá)式支持
- 用于正則表達(dá)式的 Oracle 數(shù)據(jù)庫 SQL 函數(shù)
- 正則表達(dá)式中支持的元字符
- 構(gòu)建正則表達(dá)式
1. 什么是正則表達(dá)式?
正則表達(dá)式使用標(biāo)準(zhǔn)化語法約定指定要在字符串?dāng)?shù)據(jù)中搜索的模式。正則表達(dá)式可以指定復(fù)雜的字符序列模式。例如,以下正則表達(dá)式:
a(b|c)d
搜索模式:“a”,后跟“b”或“c”,最后跟“d”。此正則表達(dá)式同時匹配“abd”和“acd”。
正則表達(dá)式使用兩種類型的字符指定:
- 元字符——指定執(zhí)行搜索的算法的運(yùn)算符。
- 文字——要搜索的實(shí)際字符。
2. Oracle 數(shù)據(jù)庫正則表達(dá)式支持
Oracle 數(shù)據(jù)庫實(shí)現(xiàn)了符合 POSIX 擴(kuò)展正則表達(dá)式 (ERE) 規(guī)范的正則表達(dá)式支持。
正則表達(dá)式支持是通過一組 Oracle 數(shù)據(jù)庫 SQL 函數(shù)實(shí)現(xiàn)的,這些函數(shù)允許您搜索和操作字符串?dāng)?shù)據(jù)。您可以在任何使用 Oracle 數(shù)據(jù)庫 SQL 的環(huán)境中使用這些函數(shù)。有關(guān)詳細(xì)信息,請參閱本章后面的“用于正則表達(dá)式的 Oracle 數(shù)據(jù)庫 SQL 函數(shù)”。
Oracle 數(shù)據(jù)庫支持正則表達(dá)式中使用的一組常見元字符。支持的元字符和相關(guān)功能的行為在“正則表達(dá)式中支持的元字符”中進(jìn)行了描述。
業(yè)界支持正則表達(dá)式的工具之間對元字符的解釋有所不同。如果您要將正則表達(dá)式從其他環(huán)境移植到 Oracle 數(shù)據(jù)庫,請確保正則表達(dá)式語法受支持并且行為符合您的預(yù)期。
3. 用于正則表達(dá)式的 Oracle 數(shù)據(jù)庫 SQL 函數(shù)
數(shù)據(jù)庫提供了一組 SQL 函數(shù),允許您使用正則表達(dá)式搜索和操作字符串。您可以在任何保存字符數(shù)據(jù)的數(shù)據(jù)類型(例如 CHAR、NCHAR、CLOB、NCLOB、NVARCHAR2 和 VARCHAR2)上使用這些函數(shù)。
正則表達(dá)式必須用單引號括起來。這樣做可以確保 SQL 函數(shù)解釋整個表達(dá)式,并可以提高代碼的可讀性。
下表給出了每個正則表達(dá)式函數(shù)的簡要說明。
SQL Function | Description |
---|---|
REGEXP_LIKE | 該函數(shù)在字符列中搜索模式。在查詢的 WHERE 子句中使用此函數(shù)可返回與您指定的正則表達(dá)式匹配的行。 |
REGEXP_REPLACE | 此函數(shù)在字符列中搜索模式,并用您指定的模式替換每次出現(xiàn)的該模式。 |
REGEXP_INSTR | 該函數(shù)在字符串中搜索給定的正則表達(dá)式模式。您指定要查找的出現(xiàn)位置以及搜索的起始位置。此函數(shù)返回一個整數(shù),指示在字符串中找到匹配項(xiàng)的位置。 |
REGEXP_SUBSTR | 此函數(shù)返回與您指定的正則表達(dá)式模式匹配的實(shí)際子字符串。 |
4. 正則表達(dá)式中支持的元字符
下表列出了支持在傳遞給 SQL 正則表達(dá)式函數(shù)的正則表達(dá)式中使用的元字符。有關(guān)這些元字符的匹配行為的詳細(xì)信息在“構(gòu)造正則表達(dá)式”中給出。
Metacharacter Syntax | Operator Name | Description |
---|---|---|
. | 任意字符——點(diǎn) | 匹配任意字符 |
+ | 一個或多個——加上量詞 | 匹配前面的子表達(dá)式的一次或多次出現(xiàn) |
? | 零或一——問號量詞 | 匹配前面的子表達(dá)式零次或一次出現(xiàn) |
* | 零或更多——星量詞 | 匹配前面的子表達(dá)式零次或多次出現(xiàn) |
{m} | 間隔–精確計(jì)數(shù) | 精確匹配前面子表達(dá)式的 m 次出現(xiàn) |
{m,} | 間隔——至少計(jì)數(shù) | 匹配至少 m 次出現(xiàn)的前面的子表達(dá)式 |
{m,n} | 間隔–計(jì)數(shù)之間 | 匹配至少 m ,但不超過 n 出現(xiàn)的前面的子表達(dá)式 |
[ … ] | 匹配字符列表 | 匹配列表中的任意字符 … |
[^ … ] | 不匹配的字符列表 | 匹配列表中不存在的任何字符 … |
| | Or | ‘a|b’ 匹配字符“a”或“b”。 |
( … ) | 子表達(dá)式或分組 | 將表達(dá)式 … 視為一個單元。子表達(dá)式可以是文字字符串或包含運(yùn)算符的復(fù)雜表達(dá)式。 |
\n | 子表達(dá)式或分組 | 將表達(dá)式 … 視為一個單元。子表達(dá)式可以是文字字符串或包含運(yùn)算符的復(fù)雜表達(dá)式。 |
\ | 轉(zhuǎn)義字符 | 將表達(dá)式中的后續(xù)元字符視為文字。 |
^ | 線錨點(diǎn)的起點(diǎn) | 僅當(dāng)后續(xù)表達(dá)式出現(xiàn)在行首時才匹配它。 |
$ | 行末錨點(diǎn) | 僅當(dāng)前面的表達(dá)式出現(xiàn)在行尾時才匹配它。 |
[:class:] | POSIX 字符類 | 匹配屬于指定字符 class 的任何字符??梢栽谌魏瘟斜肀磉_(dá)式中使用。 |
[.element.] | POSIX 整理序列 | 指定要在正則表達(dá)式中使用的整理順序。您使用的 element 必須是當(dāng)前區(qū)域設(shè)置中定義的整理序列。 |
[=character=] | POSIX 字符等效類 | 匹配與您指定的 character 具有相同基本字符的字符。 |
5. 構(gòu)建正則表達(dá)式
使用正則表達(dá)式進(jìn)行基本字符串匹配
可以使用正則表達(dá)式執(zhí)行的最簡單的匹配是基本字符串匹配。對于這種類型的匹配,正則表達(dá)式是不帶元字符的文字字符串。例如,要查找序列“abc”,請指定正則表達(dá)式:
abc
子表達(dá)式的正則表達(dá)式運(yùn)算
如前所述,正則表達(dá)式是使用元字符和文字構(gòu)造的。對單個文字進(jìn)行操作的元字符,例如“+”和“?”還可以對文字序列或整個表達(dá)式進(jìn)行操作。為此,您可以使用分組運(yùn)算符將序列或子表達(dá)式括起來。有關(guān)分組的更多信息,請參閱“子表達(dá)式”。
正則表達(dá)式運(yùn)算符和元字符用法
匹配任何字符–點(diǎn),點(diǎn)運(yùn)算符 ‘.’ 匹配當(dāng)前字符集中的任何單個字符。例如,要查找序列(“a”,后跟任何字符,后跟“c”),請使用以下表達(dá)式:
a.c
該表達(dá)式匹配以下所有序列:
abc adc a1c a&c
表達(dá)式不匹配:
abb
一個或多個——加上,一個或多個運(yùn)算符 ‘+’ 與前面的表達(dá)式的一個或多個匹配項(xiàng)相匹配。例如,要查找字符“a”的一次或多次出現(xiàn),可以使用正則表達(dá)式:
a+
該表達(dá)式匹配以下所有內(nèi)容:
a aa aaa
表達(dá)式不匹配:
bbb
零或一——問號運(yùn)算符,問號與前面的字符或子表達(dá)式的零次或一次(并且僅一次)匹配。您可以將此運(yùn)算符視為指定源文本中可選的表達(dá)式。例如,要查找“a”,可選地后跟“b”,然后后跟“c”,您可以使用以下正則表達(dá)式:
ab?c
該表達(dá)式匹配:
abc ac
表達(dá)式不匹配:
adc abbc
零個或更多——星星,零個或多個運(yùn)算符 ‘*’ 匹配零個或多次出現(xiàn)的前面的字符或子表達(dá)式。例如,要查找“a”,后跟零個或多次出現(xiàn)的“b”,然后是“c”,請使用正則表達(dá)式:
ab*c
該表達(dá)式匹配以下所有序列:
ac abc abbc abbbbc
表達(dá)式不匹配:
adc
間隔–精確計(jì)數(shù),精確計(jì)數(shù)間隔運(yùn)算符用大括號內(nèi)的單個數(shù)字指定。您可以使用此運(yùn)算符來搜索前面的字符或子表達(dá)式的確切出現(xiàn)次數(shù)。例如,要查找“a”恰好出現(xiàn) 5 次的位置,您可以指定正則表達(dá)式:
a{5}
該表達(dá)式匹配:
aaaaa
表達(dá)式不匹配:
aaaa
間隔——至少計(jì)數(shù),您可以使用至少計(jì)數(shù)間隔運(yùn)算符來搜索前面的字符或子表達(dá)式出現(xiàn)指定次數(shù)或多次的情況。例如,要查找“a”至少出現(xiàn) 3 次的位置,可以使用正則表達(dá)式:
a{3,}
該表達(dá)式匹配以下所有內(nèi)容:
aaa aaaaa
表達(dá)式不匹配:
aa
間隔–計(jì)數(shù)之間,您可以使用計(jì)數(shù)間隔運(yùn)算符來搜索指定范圍內(nèi)的出現(xiàn)次數(shù)。例如,要查找“a”出現(xiàn)至少 3 次但不超過 5 次的位置,可以使用以下正則表達(dá)式:
a{3,5}
該表達(dá)式匹配以下所有序列:
aaa aaaa aaaaa
表達(dá)式不匹配:
aa
匹配字符列表,您可以使用匹配字符列表來搜索列表中出現(xiàn)的任何字符。例如,要查找“a”、“b”或“c”,請使用以下正則表達(dá)式:
[abc]
此表達(dá)式匹配以下每個字符串中的第一個字符:
at bet cot
表達(dá)式不匹配:
def
字符列表中允許使用以下正則表達(dá)式運(yùn)算符,字符列表中包含的任何其他元字符都會失去其特殊含義(被視為文字):
- 范圍運(yùn)算符 ‘-’
- POSIX 字符類 [: :]
- POSIX 整理序列 [. .]
- POSIX 字符等效類 [= =]
不匹配的字符列表,使用非匹配字符列表指定您不想匹配的字符。不在非匹配字符列表中的字符將作為匹配項(xiàng)返回。例如,要從搜索結(jié)果中排除字符“a”、“b”和“c”,請使用以下正則表達(dá)式:
[^abc]
此表達(dá)式匹配以下字符串中的字符“d”和“g”:
abcdef ghi
表達(dá)式不匹配:
abc
與匹配字符列表一樣,非匹配字符列表中允許使用以下正則表達(dá)式運(yùn)算符(字符列表中包含的任何其他元字符都將被忽略):
- 范圍運(yùn)算符 ‘-’
- POSIX 字符類 [: :]
- POSIX 整理序列 [. .]
- POSIX 字符等效類 [= =]
例如,以下正則表達(dá)式從搜索結(jié)果中排除“a”和“i”之間的任何字符:
[^a-i]
此表達(dá)式與以下字符串中的字符“j”和“l”匹配:
hijk lmn
表達(dá)式與字符不匹配:
abcdefghi
使用 Or 運(yùn)算符 ‘|’ 指定替代表達(dá)式。例如,要匹配“a”或“b”,請使用以下正則表達(dá)式:
a|b
子表達(dá)式,您可以使用子表達(dá)式運(yùn)算符將要查找的字符分組為字符串或創(chuàng)建復(fù)雜的表達(dá)式。例如,要查找后跟“def”的可選字符串“abc”,請使用以下正則表達(dá)式:
(abc)?def
此表達(dá)式與以下字符串中的字符串“abcdef”和“def”匹配:
abcdefghi defghi
表達(dá)式與字符串不匹配:
ghi
反向引用,反向引用可讓您搜索重復(fù)的表達(dá)式。您可以使用 ‘\n’ 指定反向引用,其中 n 是 1 到 9 之間的整數(shù),表示 n th,
反向引用可讓您搜索重復(fù)的表達(dá)式。您可以使用 '\ n ' 指定反向引用,其中 n 是 1 到 9 之間的整數(shù),表示 n th
例如,要查找重復(fù)出現(xiàn)的字符串“abc”或“def”,請使用以下正則表達(dá)式:
(abc|def)\1
該表達(dá)式匹配以下字符串:
abcabc defdef
該表達(dá)式與以下字符串不匹配:
abcdef abc
反向引用從每個前面的子表達(dá)式的左括號開始從左到右對子表達(dá)式進(jìn)行計(jì)數(shù)。
反向引用允許您搜索重復(fù)的字符串,而無需提前知道實(shí)際的字符串。例如,正則表達(dá)式:
^(.*)\1$
匹配由同一字符串的兩個相鄰出現(xiàn)組成的行。
轉(zhuǎn)義字符,使用轉(zhuǎn)義字符 ‘’ 搜索通常被視為元字符的字符。例如,要搜索“+”字符,請使用以下正則表達(dá)式:
\+
此表達(dá)式與以下字符串中的加號“+”匹配:
abc+def
表達(dá)式與字符串中的任何字符都不匹配:
abcdef
線錨點(diǎn)的起點(diǎn),使用行開頭錨點(diǎn) ^ 搜索僅出現(xiàn)在行開頭的表達(dá)式。例如,要查找行開頭出現(xiàn)的字符串 def ,請使用以下表達(dá)式:
^def
此表達(dá)式與字符串中的 def 匹配:
defghi
該表達(dá)式與以下字符串中的 def 不匹配:
abcdef
行末錨點(diǎn),行尾錨元字符 ‘$’ 允許您搜索僅出現(xiàn)在行尾的表達(dá)式。例如,要查找出現(xiàn)在行尾的 def ,請使用以下表達(dá)式:
def$
此表達(dá)式與字符串中的 def 匹配:
abcdef
該表達(dá)式與以下字符串中的 def 不匹配:
defghi
POSIX 字符類,POSIX 字符類運(yùn)算符允許您在字符列表中搜索屬于特定 POSIX 字符類成員的表達(dá)式。您可以使用此運(yùn)算符搜索具有特定格式的字符(例如大寫字符),也可以搜索特殊字符(例如數(shù)字或標(biāo)點(diǎn)符號字符)。支持全套 POSIX 字符類。
要使用此運(yùn)算符,請使用語法 [: class :] 指定表達(dá)式,其中 class 是要搜索的 POSIX 字符類的名稱為了。例如,要搜索一個或多個連續(xù)的大寫字符,請使用以下正則表達(dá)式:
[[:upper:]]+
此表達(dá)式與字符串中的“DEF”匹配:
abcDEFghi
該表達(dá)式不返回以下字符串的匹配項(xiàng):
abcdefghi
POSIX 整理序列,POSIX 整理序列元素運(yùn)算符 [. .] 允許您在正則表達(dá)式中使用整理序列。您指定的元素必須是當(dāng)前語言環(huán)境中定義的整理序列。
此運(yùn)算符允許您在正則表達(dá)式中使用多字符整理序列,否則只允許使用一個字符。例如,您可以使用此運(yùn)算符來確保整理序列“ch”(在西班牙語等語言環(huán)境中定義時)在取決于字符順序的操作中被視為一個字符。
要使用整理序列運(yùn)算符,請指定 [. element .] ,其中 element 是您要查找的整理序列。您可以使用當(dāng)前區(qū)域設(shè)置中定義的任何整理序列,包括單字符元素和多字符元素。
例如,要查找整理序列“ch”,請使用以下正則表達(dá)式:
[[.ch.]]
此表達(dá)式與以下字符串中的序列“ch”匹配:
chabc
該表達(dá)式與以下字符串不匹配:
cdefg
您可以在需要排序規(guī)則的任何正則表達(dá)式中使用排序序列運(yùn)算符。例如,要指定從“a”到“ch”的范圍,可以使用以下表達(dá)式:
[a-[.ch.]]
POSIX 字符等效類,使用 POSIX 字符等效類運(yùn)算符搜索當(dāng)前區(qū)域設(shè)置中等效的字符。例如,查找西班牙語字符“ñ”以及“n”。
要使用此運(yùn)算符,請指定 [= character =] ,以查找與指定 character .
例如,以下正則表達(dá)式可用于在西班牙語語言環(huán)境中搜索相當(dāng)于“n”的字符:
[[=n=]]
此表達(dá)式與以下字符串中的“N”和“ñ”匹配:
El Ni?o
完結(jié)!
refer: https://docs.oracle.com/cd/B13789_01/appdev.101/b10795/adfns_re.htm#1007566
總結(jié)
到此這篇關(guān)于Oracle數(shù)據(jù)庫中使用正則表達(dá)式的文章就介紹到這了,更多相關(guān)Oracle數(shù)據(jù)庫正則表達(dá)式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
oracle導(dǎo)出sql語句的結(jié)果集和保存執(zhí)行的sql語句(深入分析)
本篇文章是對oracle導(dǎo)出sql語句的結(jié)果集與保存執(zhí)行的sql語句進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Oracle 數(shù)據(jù)庫優(yōu)化實(shí)戰(zhàn)心得總結(jié)
優(yōu)化sql語句、優(yōu)化io、表設(shè)計(jì)優(yōu)化、充分利用系統(tǒng)cpu資源、優(yōu)化數(shù)據(jù)庫連接、充分利用數(shù)據(jù)的后臺處理方案減少網(wǎng)絡(luò)流量,實(shí)施系統(tǒng)資源管理分配計(jì)劃等等,感興趣的朋友可以參考下哈2013-06-06Oracle隨機(jī)函數(shù)之dbms_random使用詳解
dbms_random是oracle提供的一個隨機(jī)函數(shù)包,本文將詳細(xì)介紹函數(shù)的使用,需要的朋友可以參考下2012-12-12Oracle內(nèi)存分配不足的過程解析(業(yè)務(wù)干掛數(shù)據(jù)庫)
本文介紹了Oracle數(shù)據(jù)庫內(nèi)存分配不足的問題,原因主要是業(yè)務(wù)劇增導(dǎo)致的內(nèi)存不足,通過分析AAS負(fù)載、等待事件、transactions和阻塞情況,發(fā)現(xiàn)PGA內(nèi)存出現(xiàn)了嚴(yán)重抖動,感興趣的朋友一起看看吧2025-02-02