當前位置:首頁 » 編程語言 » oraclesql正則表達式
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

oraclesql正則表達式

發布時間: 2022-07-26 09:36:25

① oracle 可以用正則表達式嗎

sql">--正則表達式檢索REGEXP_LIKE

--測試表

CREATETABLEtest_reg_like(avarchar(20));

INSERTINTOtest_reg_likeVALUES('ABC');
INSERTINTOtest_reg_likeVALUES('A12');
INSERTINTOtest_reg_likeVALUES('12a12');
3個參數
第一個是輸入的字元串
第二個是正則表達式
第三個是取值范圍:
i:大小寫不敏感;
c:大小寫敏感;
n:點號.不匹配換行符號;
m:多行模式;
x:擴展模式,忽略正則表達式中的空白字元。
全部測試數據
SQL>SELECT*FROMtest_reg_like;
A
----------------------------------------
ABC
A12
12a12

匹配字母A的
SQL>SELECT
2*
3FROM
4test_reg_like
5WHERE
6REGEXP_LIKE(a,'A');
A
----------------------------------------
ABC
A12

匹配字母A的(大小寫不敏感)
SQL>SELECT
2*
3FROM
4test_reg_like
5WHERE
6REGEXP_LIKE(a,'A','i');
A
----------------------------------------
ABC
A12
12a12

匹配字母A後面跟1個或多個數字的(大小寫不敏感)
SQL>SELECT
2*
3FROM
4test_reg_like
5WHERE
6REGEXP_LIKE(a,'Ad+','i');
A
----------------------------------------
A12
12a12

匹配字母A開頭,數字結尾的
SQL>SELECT
2*
3FROM
4test_reg_like
5WHERE
6REGEXP_LIKE(a,'^A.+d$');
A
----------------------------------------
A12

② oracle plsql中字元串(正則表達式):val((3+4)/7)+val(4+5)+10。我想取出val((3+4)/7)這一段應該怎麼取

這個可以直接在plsql裡面運行,應該是你要的東西,記得給分哦
declare
str varchar2(100) :='val((3+4)/7)+val(4+5)+10';
substr varchar2(100):='';
valuestr varchar2(100):='';
strsql varchar2(100):='select exp from al';
exesql varchar2(100):='';
begin
while(regexp_instr(str,'\(\d+([+-\*/]\d+)*\)')>0)
loop
substr:=regexp_substr(str,'\(\d+([+-\*/]\d+)*\)');
exesql:=replace(strsql,'exp',substr);
execute immediate exesql into valuestr;
str:=replace(str,substr,valuestr);
end loop;
str:=replace(str,'val','');
dbms_output.put_line(str);
end;

③ 怎麼在 oracle 存儲過程中 使用正則表達式

15:45:11 SQL> select substr('2:1:3',instr('2:1:3',':',2)+1,
15:45:14 2 instr('2:1:3',':',3)-instr('2:1:3',':',2)-1) from al;
S
-
1
已用時間: 00: 00: 00.15
15:45:19 SQL> select substr('2:1:3',1,instr('2:1:3',':')-1) from al;
S
-
2
已用時間: 00: 00: 00.15
15:45:36 SQL> select substr('2:1:3',instr('2:1:3',':',2)+1,
15:45:38 2 instr('2:1:3',':',3)-instr('2:1:3',':',2)-1) from al;
S
-
1
已用時間: 00: 00: 00.16
15:45:56 SQL> select substr('2:1:3',instr('2:1:3',':',3)+1) from al;
S
-
3
已用時間: 00: 00: 00.16
15:46:02 SQL>

④ 如何在oracle中使用正則表達式

regexp_like 2。regexp_substr 3。regexp_instr 4。regexp_replace 看函數名稱大概就能猜到有什麼用了。 regexp_like 只能用於條件表達式,和 like 類似,但是使用的正則表達式進行匹配,語法很簡單: regexp_substr 函數,和 substr 類似,用於拾取合符正則表達式描述的字元子串,語法如下: regexp_instr 函數,和 instr 類似,用於標定符合正則表達式的字元子串的開始位置,語法如下: regexp_replace 函數,和 replace 類似,用於替換符合正則表達式的字元串,語法如下: 這里解析一下幾個參數的含義: 1。source_char,輸入的字元串,可以是列名或者字元串常量、變數。 2。pattern,正則表達式。 3。match_parameter,匹配選項。 取值范圍: i:大小寫不敏感; c:大小寫敏感;n:點號 . 不匹配換行符號;m:多行模式;x:擴展模式,忽略正則表達式中的空白字元。 4。position,標識從第幾個字元開始正則表達式匹配。 5。occurrence,標識第幾個匹配組。 6。replace_string,替換的字元串。 說了一堆文縐縐的,現在開始實例演練了,在此之前先建好一個表。 01 create table tmp as 02 with data as ( 03 select 'like' as id ,'a9999' as str from al union all 04 select 'like' ,'a9c' from al union all 05 select 'like' ,'A7007' from al union all 06 select 'like' ,'123a34cc' from al union all

⑤ Oracle正則表達式

Oracle正則表達式的應用在oracle里正則表達式有四個函數可用,分別是regexp_like、regexp_substr、regexp_instr 和regexp_replace。這里在我們oracle 10g里靈活應用。 先來簡單介紹一下正則表達式的內容,正則表達式是做為快速查詢的文本內容的,在linux應用比較多,首先,行的起始與結束 「^」這個字元是表示只查找行首的內容。「$」這個字元只查找行末的內容。接下來是「^」還可以做為一個排除字元來使用。還是使用例子來做一個演示比較明了一下。 這里我使用regexp_like這個函數來做,這樣可以我們平時會使用的比較多。select * from test_tablewhere regexp_like(field_1,'^1234')這個就是表示是以1234打頭的字元串是不是有匹配的。這里和like的方式是一樣的。 select * from test_tablewhere regexp_like(field_1,'^[12]234')這里多了一個[]這里做一個獨立字元,這里表示是以1或2開始,並且接著是234這個里的字元就會是匹配的。 select * from test_tablewhere regexp_like(field_1,'^(歐陽|李)小二')這里我們就可以表達,這個查詢一個姓是歐陽或李的,名字叫小二的字元串。這里多了一個()這個是做一個為字元串的方式來寫的與[]剛好是對應。這里還有一個「|」來表示或的意思。 select * from test_tablewhere regexp_like(field_1,'^李[小]*二')這里我們就可以查詢李小二或是李二,再或者是李小小二,都可以,這里我們需要講一下是[]後面帶了一個*,這個是表示0~無窮大 字元去匹配。這個[]我們還可以添加一個「+」來表示1~無窮大的字元去匹配,也可以更加精準一些,在[]後面{1,3}這里就是表示1個到3個相同字元的匹配。還有一個「?」來說表示1或是0個。 select * from test_tablewhere regexp_like(field_1,'李[^小]二')這里我們可以查詢到姓李的,但是第二字不是「小」這個字。 select * from test_tablewhere regexp_like(field_1,'[0-9]')這里是表示我們查詢字元串含有0-9的數字的字元串。 select * from test_tablewhere regexp_like(field_1,'[a-z]')這里是表示我們查詢字元串含有a-z的小寫字母的字元串。 select * from test_tablewhere regexp_like(field_1,'[A-z]')這里是表示我們查詢字元串含有A-z的所有字母的字元串。 select * from test_tablewhere regexp_like(name,'[[:alpha:]]')這里是表示查詢匹配任意字母,也包括中文字 select * from test_tablewhere regexp_like(name,'[[:alnum:]]')這里是表示查詢匹配任意字母和數字 select * from test_tablewhere regexp_like(name,'[[:digit:]]')這里是表示查詢匹配任意數字 Select * from test_tableWhere regexp_like(name,』of』,』i』)這里就是of不區分大小寫 Select * from test_tableWhere regexp_like(name,』^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$』)這樣我們可以查詢是不是ip格式 接下來介紹一下regexp_substr這個也是一個非常實用的一個函數 REGEXP_SUBSTR與SUBSTR函數相同,返回截取的子字元串 REGEXP_SUBSTR(srcstr, pattern [, position [, occurrence [, match_option]]]) 註: srcstr 源字元串 pattern 正則表達式樣式 position 開始匹配字元位置 occurrence 匹配出現次數 match_option 匹配選項(區分大小寫) SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+') FROM al; Output: 1PSN [[:alnum:]]+ 表示匹配1個或者多個字母或數字字元 SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+', 1, 2) FROM al; Output: 231 與上面一個例子相比,多了兩個參數1 表示從源字元串的第一個字元開始查找匹配2 表示第2次匹配到的字元串(默認值是「1」,如上例) select regexp_substr('@@/231_3253/ABc','@*[[:alnum:]]+') from al; Output: 231 @* 表示匹配0個或者多個@ [[:alnum:]]+ 表示匹配1個或者多個字母或數字字元注意:需要區別「+」和「*」的區別 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]*') from al; Output: @@+ 表示匹配1個或者多個@ [[:alnum:]]* 表示匹配0個或者多個字母或數字字元 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from al; Output: Null @+ 表示匹配1個或者多個@ [[:alnum:]]+ 表示匹配1個或者多個字母或數字字元 select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from al; Output: 125 [[:digit:]]+$ 表示匹配1個或者多個數字結尾的字元 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from al; Output: Null @+ 表示匹配1個或者多個@ [[:alnum:]]+ 表示匹配1個或者多個字母或數字字元 select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from al; Output: 125 [[:digit:]]+$ 表示匹配1個或者多個數字結尾的字元 select regexp_substr('@1PSN/231_3253/ABc','[^[:digit:]]+$') from al; Output: /ABc [^[:digit:]]+$ 表示匹配1個或者多個不是數字結尾的字元 select regexp_substr('[email protected]','[^@]+') from al; Output: Tom_Kyte [^@]+ 表示匹配1個或者多個不是「@」的字元 select regexp_substr('1PSN/231_3253/ABc','[[:alnum:]]*',1,2) from al; Output: Null [[:alnum:]]* 表示匹配0個或者多個字母或者數字字元註:因為是匹配0個或者多個,所以這里第2次匹配的是「/」(匹配了0次),而不是「231」,所以結果是「Null」 這里我們有時候會查詢字元串里asdfafd<main>dafda 這里我們要取出<main>這個字元串Select regexp_substr('asdfafd<main>dafda','<[^>]+>') from alOutput: <main> 這里我們在<>中間去一個^>這樣在匹配<之後,在向後查詢的時候確保在匹配到>之前不再在有>,不然的話就要有可以出錯的情況。 Select regexp_substr('asdfafd<main>da>fda','<[^<]+>') from alOutput: <main>da>在這個例子中,我們在<main>之後還在da>,這樣的話,如果我們沒有添加^>,正則表達式就會向後繼續去匹配,直到最後一個>為至,這樣就會出現偏差 這個通常用來實現字元串的列傳行select regexp_substr('123;234;345;456;567;678;789','[^;]+',1,rownum) from alconnect by rownum <= length('123;234;345;456;567;678;789') - length(replace('123;234;345;456;567;678;789',';'))+1這里length這里操作是先得到有多少個「;」,再通過 connect by rownum方式來做一行成多行的操作,在變成多行之後,可以通過regexp_substr來取字元串的操作 接著上一個例子a,b,c,d,e,d,f,a,n這樣的一個字元串,我們現在要把字元串里一些重復去掉,這樣的話結果是a,b,c,d,e,f,n去掉了d與a的兩個字元串select wm_concat(new_row) from (select distinct regexp_substr('a,b,c,d,e,d,f,a,n','[^,]+',1,rownum) new_row from alconnect by rownum<=length('a,b,c,d,e,d,f,a,n')-length(replace('a,b,c,d,e,d,f,a,n',',')))通過轉成多行的,再用distinct 去掉重復,然後我們再通過wm_concat來字元串合並來完成。 再來一個ip格式轉換的例子吧,我們一般的IP的格式是12.19.168.27現在要不足3位的補足前面為0,結果是012.019.168.027select wm_concat(new_value) from (select lpad(regexp_substr('12.19.168.27','[^.]+',1,rownum) ,3,'0') new_value,rownumfrom alconnect by rownum<5order by rownum) 來一個驗證IP是數字是否正確select count(*) from(select lpad(regexp_substr('12.19.168.27','[^.]+',1,rownum) ,3,'0') new_value,rownumfrom alconnect by rownum<5)where new_value>=0 and new_value<256having count(*) =4 來一個IP字元串格式轉換成數字型IPselect sum(new_value*power(256,4-rm)) from (select regexp_substr('12.19.168.27','[^.]+',1,rownum) new_value,rownum rm from alconnect by rownum<=4) 接下來介紹一個regexp_instr函數 REGEXP_INSTR 函數使用正則表達式返回搜索模式的起點和終點。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,模式出現的時候,要返回什麼內容。 Select regexp_instr('asdfafd<main>da>fda','sd') from alOutput:2這里去查詢sd的位置,這個和instr是在相同的 Select regexp_instr('asdfafd<main>da>fda','da',1,2) from al這里是查詢da第二出現的位置 還有我們經常會遇到一種情況是,查詢某個欄位,如果是等於「上海」或「北京」或者我們溫州就寫成大城市,其它的寫成小城市,我們一般會考慮使用decode這種方式 Select decode('上海','上海','大城市','北京' ,'大城市' ,'溫州' ,'大城市','小城市') from al只有兩個我們可能覺的sql也不是很冗長,如果有四五個的話,就有點長了,這里使用regexp_instr就可以很多的去操作 Select decode (regexp_instr('北京','^(上海|北京|溫州)'),0,'小城市', '大城市') from al通過regexp_instr不匹配時為0的條件,這樣就可以完成了 最後一個函數regexp_replaceREGEXP_REPLACE 函數是用另外一個值來替代串中的某個值。例如,可以用一個匹配數字來替代字母的每一次出現。REGEXP_REPLACE的格式如下所示 語法: 4.REGEXP_REPLACE與REPLACE函數相同,替換原字元串中的字元內容 REGEXP_REPLACE(srcstr, pattern [,replacestr [, position [, occurrence [,match_option]]]]) 這個替換函數還是一個非常好用的。如我們在有一個字元串adfadfa (main) next 現在我們要把()替換成<>,這里我們可能想用replace就可以搞定了,但是我們現在做的是(之後必須有)這樣的()我們才替換把<>.select regexp_replace('adfadfa (main) next ','(\()([^\)]*)(\))','<\2>') from aloutput: adfadfa <main> next這里還是一個\做為轉義字元。 再來一個ip格式轉換的例子吧,我們一般的IP的格式是12.19.168.27現在要不足3位的補足前面為0,結果是012.019.168.027select regexp_replace(regexp_replace('12.19.168.27','([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})','00\1.00\2.00\3.00\4') ,'([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}$)','\2\4\6\8')from aloutput: 012.019.168.027這里我分成兩步來操作,regexp_replace('12.19.168.27','([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})','00\1.00\2.00\3.00\4')我首先讓每個小字元串做添加0,這樣每個字元串都會大於3,再'([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}$)','\2\4\6\8')這整個字元串分成8段,這樣我們只要2、4、6、8這四個段就可以了。 下面一個例子中,在每兩個字元之間插入一個空格符SELECT regexp_replace('YAHOO', '(.)', '\1 ') AS output FROM al; Output: Y A H O O這個用一個循環的方式去操作,還蠻很好的。 select regexp_replace(regexp_replace('12.19.168.27','([^.]+)','00\1') ,'([^.]*)([^.]{3})','\2')from al接著剛才那個,我們可以把replace循環替換的方式來操作。

⑥ oracle 正則表達式

select regexp_replace('If IsValid("date", to_date(Trim(LK_01.TX_DATE) Then "19111111" then ','if\s+isvalid.*\((.*?)\).*?then','\1 ',1,0,'i') from al;

這樣的話就是得出LK_01.TX_DATE這個結果啦
嘻嘻

⑦ oracle函數中正則表達式 是什麼意思

ORACLE 中的支持正則表達式的函數主要有下面四個:
1,REGEXP_LIKE :與 LIKE的功能相似
2,REGEXP_INSTR :與INSTR的功能相似
3,REGEXP_SUBSTR :與SUBSTR 的功能相似
4,REGEXP_REPLACE :與REPLACE的功能相似
它們在用法上與Oracle SQL 函數 LIKE、INSTR、SUBSTR 和REPLACE 用法相
同.

⑧ oracle SQL 正則表達式

正則表達式已經在很多軟體中得到廣泛的應用,包括*nix(Linux, Unix等),HP等操作系統,PHP,C#,Java等開發環境。
本文主要介紹了關於Oracle中正則表達式的使用方法,下面話不多說了,來一起看看詳細的介紹。
Oracle使用正則表達式離不開這4個函數:regexp_like、regexp_substr、regexp_instr、regexp_replace。
1、regexp_like
該函數只能用於條件表達式,和 like 類似,但是使用的正則表達式進行匹配
2、regexp_substr
該函數和 substr 類似,用於拾取合符正則表達式描述的字元子串
3、regexp_instr
該函數和 instr 類似,用於標定符合正則表達式的字元子串的開始位置
4、regexp_replace
該函數和 replace 類似,用於替換符合正則表達式的字元串

⑨ oracle 的正則表達式

oracle的正則表達式(10g才可以用)

oracle的正則表達式(regular expression)簡單介紹
目前,正則表達式已經在很多軟體中得到廣泛的應用,包括*nix(Linux, Unix等),HP等操作系統,PHP,C#,Java等開發環境。
Oracle 10g正則表達式提高了SQL靈活性。有效的解決了數據有效性,重復詞的辨認, 無關的空白檢測,或者分解多個正則組成的字元串等問題。
Oracle 10g支持正則表達式的四個新函數分別是:REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、和REGEXP_REPLACE。
它們使用POSIX 正則表達式代替了老的百分號(%)和通配符(_)字元。
特殊字元:
'^' 匹配輸入字元串的開始位置,在方括弧表達式中使用,此時它表示不接受該字元集合。
'$' 匹配輸入字元串的結尾位置。如果設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或'\r'。
'.' 匹配除換行符 \n之外的任何單字元。
'?' 匹配前面的子表達式零次或一次。
'*' 匹配前面的子表達式零次或多次。
'+' 匹配前面的子表達式一次或多次。
'( )' 標記一個子表達式的開始和結束位置。
'[]' 標記一個中括弧表達式。
'{m,n}' 一個精確地出現次數范圍,m=<出現次數<=n,'{m}'表示出現m次,'{m,}'表示至少出現m次。
'|' 指明兩項之間的一個選擇。例子'^([a-z]+|[0-9]+)$'表示所有小寫字母或數字組合成的字元串。
\num 匹配 num,其中 num 是一個正整數。對所獲取的匹配的引用。
正則表達式的一個很有用的特點是可以保存子表達式以後使用,被稱為Backreferencing. 允許復雜的替換能力
如調整一個模式到新的位置或者指示被代替的字元或者單詞的位置. 被匹配的子表達式存儲在臨時緩沖區

中,緩沖區從左到右編號, 通過\數字元號訪問。 下面的例子列出了把名字 aa bb cc 變成cc, bb, aa.
Select REGEXP_REPLACE('aa bb cc','(.*) (.*) (.*)', '\3, \2, \1') FROM al;
REGEXP_REPLACE('ELLENHILDISMIT
cc, bb, aa
'\' 轉義符。
字元簇:
[[:alpha:]] 任何字母。
[[:digit:]] 任何數字。
[[:alnum:]] 任何字母和數字。
[[:space:]] 任何白字元。
[[:upper:]] 任何大寫字母。
[[:lower:]] 任何小寫字母。
[[unct:]] 任何標點符號。
[[:xdigit:]] 任何16進制的數字,相當於[0-9a-fA-F]。
各種操作符的運算優先順序
\ 轉義符
(), (?, (?=), [] 圓括弧和方括弧
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \anymetacharacter 位置和順序
| 「或」操作
--測試數據
create table test(mc varchar2(60));
insert into test values('112233445566778899');
insert into test values('2344 5566778899');
insert into test values('33112244 5566778899');
insert into test values('44112233 5566 778899');
insert into test values('5511 2233 4466778899');
insert into test values('661122334455778899');
insert into test values('771122334455668899');
insert into test values('881122334455667799');
insert into test values('991122334455667788');
insert into test values('aabbccddee');
insert into test values('bbaaaccddee');
insert into test values('ccabbddee');
insert into test values('ddaabbccee');
insert into test values('eeaabbccdd');
insert into test values('ab123');
insert into test values('123xy');
insert into test values('007ab');
insert into test values('abcxy');
insert into test values('The final test is is is how to find plicate words.');
commit;
一、REGEXP_LIKE
select * from test where regexp_like(mc,'^a{1,3}');
select * from test where regexp_like(mc,'a{1,3}');
select * from test where regexp_like(mc,'^a.*e$');
select * from test where regexp_like(mc,'^[[:lower:]]|[[:digit:]]');
select * from test where regexp_like(mc,'^[[:lower:]]');
Select mc FROM test Where REGEXP_LIKE(mc,'[^[:digit:]]');
Select mc FROM test Where REGEXP_LIKE(mc,'^[^[:digit:]]');
二、REGEXP_INSTR
Select REGEXP_INSTR(mc,'[[:digit:]]$') from test;
Select REGEXP_INSTR(mc,'[[:digit:]]+$') from test;
Select REGEXP_INSTR('The price is $400.','\$[[:digit:]]+') FROM DUAL;
Select REGEXP_INSTR('onetwothree','[^[[:lower:]]]') FROM DUAL;
Select REGEXP_INSTR(',,,,,','[^,]*') FROM DUAL;
Select REGEXP_INSTR(',,,,,','[^,]') FROM DUAL;
三、REGEXP_SUBSTR
SELECT REGEXP_SUBSTR(mc,'[a-z]+') FROM test;
SELECT REGEXP_SUBSTR(mc,'[0-9]+') FROM test;
SELECT REGEXP_SUBSTR('aababcde','^a.*b') FROM DUAL;
四、REGEXP_REPLACE
Select REGEXP_REPLACE('Joe Smith','( ){2,}', ',') AS RX_REPLACE FROM al;
Select REGEXP_REPLACE('aa bb cc','(.*) (.*) (.*)', '\3, \2, \1') FROM al;