oracle 正規表示式

2021-09-01 22:47:11 字數 4269 閱讀 8901

oracle中的支援正規表示式的函式主要有下面四個:

1,regexp_like :與like的功能相似

2,regexp_instr :與instr的功能相似

3,regexp_substr :與substr的功能相似

4,regexp_replace :與replace的功能相似

正規表示式中常用到的元資料(metacharacter)如下:^ 匹配字串的開頭位置。

$ 匹配支付傳的結尾位置。

*匹配該字元前面的乙個字元0次,1次或者多次出現。例如52*oracle 可以匹配 5oracle,52oracle,522oracle,5222oracle等等。

+ 匹配該字元前面的乙個字元1次或者多次出現。例如52+oracle 可以匹配 52oracle,522oracle,5222oracle等等

? 匹配該字元前面的乙個字元0次或1次或者多次出現。例如52?oracle 只能匹配5oracle,52oracle等等

匹配乙個字串n次,n為正整數。例如:helo 所匹配的是hello

匹配乙個字串至少n次,至多m次。其中n和m都是整數。

. 匹配除了null之外的任何單個字串

(pattern) 這個是用來匹配指定模式的乙個子表示式

x|y 匹配x或者y,其中x和y是乙個或者多個字元

[abc] 匹配括號中的任意乙個字元。例如:[ab]bc可以匹配abc和bbc

[a-z] 匹配指定範圍內的任意字串。例如[a-g]hi可以匹配ahi至ghi

[::]指定乙個字元類,可以匹配該類中的任意字元 這裡的字元類包括:

[:alphanum:] 可以匹配字元0-9、a-z、a-z

[:alpha:]可以匹配字元a-z、a-z

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

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

[:gragh:]可以匹配非空字元

[:punct:]可以匹配. , 」 『等標點符號。

[:upper:]可以匹配字元a-z

[:lower:]可以匹配字元a-z

各種操作符的運算優先順序

\轉義符

(), (?:), (?=), 圓括號和方括號

*, +, ?, , , 限定符

^, $, anymetacharacter 位置和順序

| */

字串』^198[0-9]$』可以匹配『1980-1989』,如果希望統計出公司那些員工是80年~89年入職的,就可以使用如下的sql語句:

select * from

empe where

regexp_like

(to_char

( e.

hiredate

,'yyyy

'),'^198[0-9]$');

substr和instr套嵌使用就可以實現indexof類似功能

--查詢@tv 後面是否全部都是數字

select t.acc_nbr,t.main_acc_nbr from user t

where regexp_like(substr(t.main_acc_nbr,instr(upper(t.main_acc_nbr),'@tv')+3,20),'^[0-9]+[0-9]*$')

and t.acc_nbr='pay001';

--查詢@tv 後面是否全部都是數字

select t.acc_nbr,t.main_acc_nbr from user t

where regexp_like(substr(t.main_acc_nbr,instr(upper(t.main_acc_nbr),'@tv')+3,20),'^[[:digit:]]+$')

and t.acc_nbr='pay001';

--查詢@tv 後面是否全部都是數字

select t.main_acc_nbr from user t

--排除沒有@tv的賬號

where to_number(instr(t.main_acc_nbr,'@tv')) != 0

--排除賬號@tv 後面是否全部都是數字

and regexp_like(substr(t.main_acc_nbr,instr(upper(t.main_acc_nbr),'@tv')+3,20),'^[0-9]+[0-9]*$') ;

參考:oracle 字元函式相關

正規表示式用於字串處理、表單驗證等場合,實用高效。現將一些常用的表示式收集於此,以備不時之需。

使用者名稱:/^[a-z0-9_-]$/

密碼:/^[a-z0-9_-]$/

十六進製制值:/^#?([a-f0-9]|[a-f0-9])$/

html 標籤:/^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/

unicode編碼中的漢字範圍:/^[u4e00-u9fa5],$/

匹配中文字元的正規表示式: [\u4e00-\u9fa5]

評注:匹配中文還真是個頭疼的事,有了這個表示式就好辦了

匹配雙位元組字元(包括漢字在內):[^\x00-\xff]

評注:可以用來計算字串的長度(乙個雙位元組字元長度計2,ascii字元計1)

匹配空白行的正規表示式:\n\s*\r

評注:可以用來刪除空白行

匹配html標記的正規表示式:<(\s*?)[^>]*>.*?|<.*? />

評注:網上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對於複雜的巢狀標記依舊無能為力

匹配首尾空白字元的正規表示式:^\s*|\s*$

評注:可以用來刪除行首行尾的空白字元(包括空格、製表符、換頁符等等),非常有用的表示式

匹配email位址的正規表示式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

評注:表單驗證時很實用

匹配**url的正規表示式:[a-za-z]+://[^\s]*

評注:網上流傳的版本功能很有限,上面這個基本可以滿足需求

匹配帳號是否合法(字母開頭,允許5-16位元組,允許字母數字下劃線):^[a-za-z][a-za-z0-9_]$

評注:表單驗證時很實用

匹配國內**號碼:\d-\d|\d-\d

評注:匹配形式如 0511-4405222 或 021-87888822

匹配身份證:\d|\d

評注:中國大陸的身份證為15位或18位

匹配特定數字:

^[1-9]\d*$  //匹配正整數

^-[1-9]\d*$//匹配負整數

^-?[1-9]\d*$//匹配整數

^[1-9]\d*|0$//匹配非負整數(正整數 + 0)

^-[1-9]\d*|0$//匹配非正整數(負整數 + 0)

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$//匹配正浮點數

^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$//匹配負浮點數

^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$//匹配浮點數

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$//匹配非負浮點數(正浮點數 + 0)

^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ //匹配非正浮點數(負浮點數 + 0)

評注:處理大量資料時有用,具體應用時注意修正

匹配特定字串:

^[a-za-z]+$ //匹配由26個英文本母組成的字串

^[a-z]+$ //匹配由26個英文本母的大寫組成的字串

^[a-z]+$ //匹配由26個英文本母的小寫組成的字串

^[a-za-z0-9]+$ //匹配由數字和26個英文本母組成的字串

^\w+$ //匹配由數字、26個英文本母或者下劃線組成的字串

去除精度緯度中非浮點數

select jd,wd from xx_xa_xsczaqpc t where t.id not in(

select id from xx_xa_xsczaqpc where regexp_like(jd,'^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$')) ;

是雙小數點的數

select xx_jbxx_id,jd,wd from xx_xa_xsczaqpc t where regexp_like(jd,'^[1-9]\d*\.\d*\.\d*[1-9]\d*$')

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 正規表示式代替了老的百分號 和萬用字元 字元。特殊字元 匹配輸入字串的開始位置,在方括號表示式中使用,此時它表示不接...