Oracle 正規表示式

2021-08-27 01:42:14 字數 3656 閱讀 3201

oracle正規表示式

正規表示式具有強大、便捷、高效的文字處理功能。能夠新增、刪除、分析、疊加、插入和修整各種型別的文字和資料。oracle從10g開始支援正規表示式。

下面通過一些例子來說明使用正規表示式來處理一些工作中常見的問題。

1. regexp_substr

regexp_substr 函式使用正規表示式來指定返回串的起點和終點,返回與source_string 字符集中的varchar2 或clob 資料相同的字串。

語法:

--1.regexp_substr與substr函式相同,返回擷取的子字串

regexp_substr(srcstr, pattern [, position [, occurrence [, match_option]]])

注: srcstr

源字串 pattern

正規表示式樣式 position

開始匹配字元位置 occurrence

匹配出現次數 match_option

匹配選項(區分大小寫) 1.1從字串中擷取子字串

select regexp_substr('1psn/231_3253/abc', '[[:alnum:]]+') from dual;

output: 1psn

[[:alnum:]]+ 表示匹配1個或者多個字母或數字字元。 select regexp_substr('1psn/231_3253/abc', '[[:alnum:]]+', 1, 2) from dual;

output: 231

與上面乙個例子相比,多了兩個引數

1 表示從源字串的第乙個字元開始查詢匹配 2

表示第2次匹配到的字串(預設值是"1",如上例) select regexp_substr('@@/231_3253/abc','@*[[:alnum:]]+') from dual;

output: 231

@* 表示匹配0個或者多個@ [[:alnum:]]+ 表示匹配1個或者多個字母或數字字元 注意:需要注意"+"和"*"的區別

select regexp_substr('1@/231_3253/abc','@+[[:alnum:]]*') from dual;

output: @

@+ 表示匹配1個或者多個@ [[:alnum:]]* 表示匹配0個或者多個字母或數字字元 select regexp_substr('1@/231_3253/abc','@+[[:alnum:]]+') from dual;

output: null

@+ 表示匹配1個或者多個@ [[:alnum:]]+ 表示匹配1個或者多個字母或數字字元 select regexp_substr('@1psn/231_3253/abc125','[[:digit:]] +$') from dual;

output: 125

[[:digit:]]+$ 表示匹配1個或者多個數字結尾的字元 select regexp_substr('@1psn/231_3253/abc','[^[:digit:]]+$ ') from dual;

output: /abc

[^[:digit:]]+$ 表示匹配1個或者多個不是數字結尾的字元 select regexp_substr('[email protected]','[^@]+') from dual;

output: tom_kyte

[^@]+ 表示匹配1個或者多個不是"@"的字元 select regexp_substr('1psn/231_3253/abc','[[:alnum:]]*',1 ,2)

from dual;

output: null

[[:alnum:]]* 表示匹配0個或者多個字母或者數字字元 注:因為是匹配0個或者多個,所以這裡第2次匹配的是"/"(匹配了0次),而不是"231",所以結果是"null" 1.2匹配重複出現

查詢連續2個小寫字母

select regexp_substr('republicc of africaa', '([a-z])\1', 1, 1, 'i') from dual; output: cc ([a-z])

表示小寫字母a-z \1

表示匹配前面的字元的連續次數 1

表示從源字串的第1個字元開始匹配 1

第1次出現符合匹配結果的字元 i

表示區分大小寫 1.3其他一些匹配樣式

查詢網頁位址資訊

select regexp_substr('go to and click on database', 'http://([[:alnum:]]+\.?)/?') result from dual output: 其中:

表示匹配字串"http://" ([[:alnum:]]+\.?) 表示匹配1次或者多次字母或數字字元,緊跟0次或1次逗號符

表示匹配前面的字元最少3次,最多4次 /?

表示匹配乙個反斜槓字元0次或者1次 提取csv字串中的第三個值

select regexp_substr('1101,yokohama,japan,1.5.105', '[^,]+', 1, 3) as output from dual; output: japan 其中:

[^,]+

表示匹配1個或者多個不是逗號的字元 1

表示從源字串的第乙個字元開始查詢匹配 3

表示第3次匹配到的字串 注:這個通常用來實現字串的列傳行

--字串的列傳行

select regexp_substr('1101,yokohama,japan,1.5.105', '[^,]+', 1, level) as output

from dual

connect by level 正規表示式返回搜尋模式的起點和終點。regexp_instr 的語法如下所示。regexp_instr 返回乙個整數,指出搜尋模式的開始或結束的位置,如果沒有發現匹配的值,則返回0。

語法:

--2.regexp_instr與instr函式相同,返回字串位置

regexp_instr(srcstr, pattern [, position [, occurrence [, return_option [,match_option]]]]) 與regexp_substr一樣,它也有變數pattern、position(開始位置)、occurrence 和match_parameter;這裡主要介紹一下新引數return_option 的作用,它允許使用者告訴oracle,模式出現的時候,要返回什麼內容。

具體如下面的例子所示:

--如果return_option 為0 則,oracle 返回第乙個字元出現的位置。這是預設值,與instr的作用相同

select regexp_instr('abc1def',

'[[:digit:]]') output

from dual;

output: 4

--如果return_option 為1,則oracle 返回跟在所搜尋字元出現以後下乙個字元的位置。

--例如,下面的查詢返回了在串中發現的第乙個數字後的位置:

select regexp_instr('abc1def',

'[[:digit:]]',1,1,1) output

from dual;

output: 5 --------原文**:

oracle 正規表示式

with temp as select br.777 1 a from dual union all select bs.6 175 a from dual union all select d.140 supplement 1 a from dual union all select e.191 ...

oracle正規表示式

在資料庫可直接執行下面語句,但在程式中不能執行,regexp like t.ipaddress,25 0 5 2 0 4 0 9 01 0 9 0 9 25 0 5 2 0 4 0 9 01 0 9 0 9 報錯有特殊字元 在句末再加乙個 改為 regexp like t.ipaddress,25 ...

oracle正規表示式

oracle 10g支援正規表示式的四個新函式分別是 regexp like regexp instr regexp substr 和regexp replace。它們使用posix 正規表示式代替了老的百分號 和萬用字元 字元。特殊字元 匹配輸入字串的開始位置,在方括號表示式中使用,此時它表示不接...