資料庫之正規表示式4個字串操作函式

2021-09-26 03:40:56 字數 4158 閱讀 9645

正規表示式的重要:

當我們要進行一些簡單的糊塗查詢時用百分號(%),萬用字元(_)就可以了。其中%表達任意長度的字串。_表示任意的某乙個字元。

比如

select * from emp where ename like 's%' or ename like 's_';
但如果在一些複雜的查詢中關用這兩個符號sql語句就會非常複雜,而且也不一定能實現.從oracle 10g開始引入了在其他程式語言中普通使用的正規表示式。

資料庫sql中主要有regexp_like,regexp_replace,regexp_substr,regexp_instr四個正規表示式函式。

元字元

意思

例子

說明要匹配的字元是乙個特殊字元、常量或者後者引用。(後引用重複上一次的匹配)

\n 匹配換行符

\\ 匹配 \

匹配(匹配( 匹配 )

^匹配字串的開頭位置

^a匹配arwen,但不匹配barwen。

匹配字串的末尾位置

en$匹配arwen,但不匹配arwenb。

匹配前面的字元0次或多次

a*rwen可以匹配rwen或aaarwen。

+匹配前面的字元1次或多次

a+rwen可以匹配arwen或aarwen.但不能匹配rwen。

?匹配前面的字元0次或1次

a?rwen可以匹配arwen或rwen.但不能匹配aarwen。

匹配前面的字元恰好是n次,其中n是整數

arwen可以匹配arrwen.但不能匹配arwen或arrrwen。

匹配前面的字元至少是n次,最多是m次。如果寫成

表示最少匹配n次,沒有上限。

arwen可以匹配arwen,arrwen.但不匹配awen或arrrwen。

.點號,匹配除null,換行以外的任意單個字元

arw.n.可以匹配arwen,arwin.但不能匹配arween或arwn.

(pattern)

括號中pattern是乙個子正規表示式,匹配指定pattern模式的乙個子表示式。

其實括號就像一般語言表示式中的括號.有時多加些括號可增強可讀性.另外的用處見下面關於\n的描述.

x|y匹配「或」

x|y可以匹配x或者y

[abc]

可以匹配abc中的任何單個字元

hello[abc]可以匹配helloa,hellob,helloc

[a-z]

可以匹配指定範圍內的任何單個字元

hell[a-z]可以匹配hello或者hellz

[::]

指定乙個字元類,可以匹配該類中的任何字元

[: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是乙個正整數

arw(en)\1可以匹配arwenen.注意\1前面必須是個加括號的子表示式。

regexp_like(x,pattern[,match_option]),檢視x是否與pattern相匹配,該函式還可以提供乙個可選的引數match_option字串說明預設的匹配選項。match_option的取值如下:

c說明在進行匹配時區分大小寫(預設值)

i說明在進行匹配時不區分大小寫

n(.)點號能表示所有單個字元,包括換行(暫時還不知道什麼地方有用到換行,只知道sql裡面可以用chr(10)表示換行。

m字串存在換行的時候當作多行處理,這樣$就可匹配每行的結尾,不然的話$只匹配字串最後的位置。

示例:

select * from emp where regexp_like(ename,'^a[a-z]*n$');
可以查詢ename中以a開頭以n結尾的行,例如ename為arwen或arwin或anden。但arwen不能被匹配,因為預設是區分大小寫,如果是select * from emp where regexp_like(ename,'^a[a-z]*n$','i')則可以查詢ename為arwen的行記錄。

regexp_instr(x,pattern[,start[,occurrence[,return_option[,match_option]]]])用於在x中查詢pattern。返回pattern在x**現的位置。匹配位置從1開始。可以參考字串函式instr(),引數相關:

start

開始查詢的位置

occurrence

說明應該返回第幾次出現pattern的位置

return_option

說明應該返回什麼整數。若該引數為0,則說明要返回的整數是x中的乙個字元的位置;若該引數為非0的整數,則說明要返回的整數為x**現在pattern之後   的字元的位置;

match_option

修改預設的匹配設定.與regexp_like裡面的相同。

示例:

declare     

v_result integer ;

begin

select regexp_instr('hello world','o',1,1,0) into v_result

from dual;

dbms_output.put_line(v_result);

end;

結果為5,即字母o第乙個次出現的位置。

如果regexp_instr('hello world','o',1,1,n),其中n為除0之外的整數。比如1,3。則結果為6,表示第一次出現字母o的後面乙個字元的位置。

如果regexp_instr('hello world','o',1,2,0),則結果為9,表示第二次出現字母o的位置。

regexp_replace(x,pattern[,replace_string[,start[,occurrence[,,match_option]]]])用於在x中查詢pattern,並將其替換為replae_string。可以參考字串函式replace(),引數同regexp_instr函式。

示例:

declare     

v_result varchar2(90);

begin

select regexp_replace('hello world','o','x',1,1) into v_result

from dual;

dbms_output.put_line(v_result);

end;

結果為hellx world。

如果regexp_replace('hello world','o','x'),則結果為hellx wxrld。

如果regexp_replace('hello world','o','x',1,2),則結果為hello wxrld。

regexp_substr(x,pattern[,start[,occurrence[,match_option]]])用於在x中查詢pattern並返回。可以參考字串函式substr(),引數同regexp_instr函式。

例如:

declare        

v_result varchar2(255);

begin

select regexp_substr('hello world','l') into v_result

from dual;

dbms_output.put_line(v_result);

end ;

結果為ll

查詢到匹配的字串才返回匹配的字元,沒查到就返回空。

正規表示式匹配多個字元 4

4.1 匹配多個字元 功能 匹配前乙個字元出現0次或者無限次,即可有可無 匹配前乙個字元出現1次或者無限次,即至少有1次 匹配前乙個字元出現1次或者0次,即要麼有1次,要麼沒有 匹配前乙個字元出現m次 匹配前乙個字元出現從m到n次 匹配前乙個字元出現至少m次 示例1 需求 匹配出乙個字串第乙個字母為...

正規表示式 匹配多個字元

功能 匹配前乙個字元出現0次或者無限次,即可有可無 匹配前乙個字元出現1次或者無限次,即至少有1次 匹配前乙個字元出現1次或者0次,即要麼有1次,要麼沒有 匹配前乙個字元出現m次 匹配前乙個字元出現從m到n次 需求 匹配出乙個字串第乙個字母為大小字元,後面都是小寫字母並且這些小寫字母可 有可無 im...

字串 4 正規表示式匹配

coding utf 8 class solution s,pattern都是字串 def match self,s,pattern write code here 兩者都為空,返回真 if len s 0 and len pattern 0 return true 僅有模式位空,返回假 if le...