1、建表
create table person (first_name varchar2(20),last_name varchar2(20),email varchar2(40),zip varchar2(20));
insert into PERSON (first_name, last_name, email, zip)
values ('Steven', 'Chen', 'steven@hp.com', '123456');
insert into PERSON (first_name, last_name, email, zip)
values ('James', 'Li', 'jamesli@sum.com' || chr(10) || 'lijames@oracle.com', '1b3d5f');
insert into PERSON (first_name, last_name, email, zip)
values ('Tina', 'Zhang', 'chillaxzx@163.com', '2456hd');
insert into PERSON (first_name, last_name, email, zip)
values ('Tom', 'Feng', 'Tomfeng@126.com', 'a654e5');
insert into PERSON (first_name, last_name, email, zip)
values ('Jonson', 'zhao', 'Jonson@google.com', 'edjksk');
insert into PERSON (first_name, last_name, email, zip)
values ('Vines', 'Wu', 'Vines@162.com', '2djks4');
commit;
select * from person;
2、通配符
- ^ 行首,如果^在[]里面,表示非的意思,匹配字符串的開頭位置,如果A是字符串的第一個字符,^A;非A開頭的字符 ^[^A]
- $ 行尾,匹配字符串的末尾位置 如果B是字符串的最后一個字符,B$
- . 點匹配除null以外的任意單個字符
- * 匹配前面的字符0次或多次 ,ba*rk可以匹配 brk、bark、baark等等
- ? 匹配前面的字符0次或1次 , ba?rk可以匹配 bark、brk,但是不能匹配baark。
- + 匹配前面的字符1次或多次 ,ba+rk可以匹配 bark、baark等等,但是不能匹配brk,也就是說,最少有以一次。
- {m} 匹配前面的字符恰好是m次, 其中n是整數 。hob{2}it可以匹配hobbit
- {m,} 匹配前面的字符至少是m次 。hob{2,}it可以匹配hobbit、hobbbit等等
- {m,n} 匹配前面的字符至少是m次,最多是n次 。hob{2,3}it可以匹配hobbit或者hobbbit
- x|y 匹配“或” x|y可以匹配x或者y
- (pattern) 括號中pattern是一個子正則表達式,匹配指定pattern模式的一個子表達式。 如:aaa(x|y)可以匹配aaax或者aaay。
- [abc] 可以匹配abc中的任何單個字符, hello[abc]可以匹配helloa,hellob,helloc
- [a-z] 可以匹配指定范圍內的任何單個字符 。hell[a-z]可以匹配hello或者hellz
- [: :] 指定一個字符類,可以匹配該類中的任何字符
[[:alphanum:]] 可以匹配字符0-9、A-Z、a-z 任意數字和字母類似于[0-9a-zA-Z]
[[:alpha:]] 可以匹配字符A-Z、a-z 任意字母,類似于 [a-zA-Z]
[[:blank:]] 可以匹配空格或tab鍵
[[:digit:]] 可以匹配數字0-9 任意數字,類似于 [0-9]
[[:graph:]] 可以匹配非空字符
[[:lower:]] 可以匹配小寫字母a-z
[[:print:]] 所有的可打印字符 與[[:graph:]]類似,不同之處在于[:print:]包括空格字符
[[:punct:]] 可以匹配標點符號.,""等等
[[:space:]] 可以匹配所有的空字符(不會打印出來)
[[:upper:]] 可以匹配大寫字母A-Z
[[:xdigit:]] 可以匹配十六進制數字0-9、A-F、a-f
3、正則函數
匹配參數
- c 大小寫敏感
- i 大小寫不敏感
- n 允許可以匹配任意字符的操作符
- m 多行模式,允許將原字符串作為多個字符串對待
- x 拓展模式,忽略正則表達式中的空白字符
(1)regexp_like 模糊匹配
regexp_like(列,匹配模式[,匹配參數])
--查詢emp表中不是S開頭或不是J開頭的員工信息
select *
from emp
--where regexp_like(ename,'^[^SJ]');
where not regexp_like(ename,'^[SJ]');--查詢名字不以S或K結尾的員工信息(在中括號中表示取反有not in 的意思,不等于中括號里所有的)
select *
from emp
--where regexp_like(ename,'[^SK]$');
where not regexp_like(ename,'[SK]$');
(2)regexp_replace 用戶替換字符串中某個值
regexp_replace(str1,匹配模式[,str3[,數1[,數2[,匹配參數]]]])
--匹配參數建立數一數二都有的情況下才能寫
replace(str1,str2[,str3]) 把str1中的str2整體替換成str3
str1:原字符串
str3:替換成的字符 不寫表示替換為空
數1:從數1位開始(不寫默認為1)
數2:第數2次符合匹配模式的字符串,不寫默認全替換(注:這里如果不寫那也不能寫匹配參數,不然系統會認為匹配參數就是他的數2)
連起來是:把str1中從第數1位開始,第數2次符合匹配模式的字符串替換成str3select 'helloworld', regexp_replace('helloworld','l','*') a,regexp_replace('helloworld','l') b,regexp_replace('helloworld','ll','*') c,regexp_replace('helloworld','l','*',1,2) d,--從第一位找第二次l出現的位置regexp_replace('helloworld','l','*',4) e
from dual;--把zip列所有的數字替換成*
select zip,regexp_replace(zip,'[0-9]','*')
from person;
--把zip列第一個數字替換成?
select zip,regexp_replace(zip,'[0-9]','?',1,1)
from person;
--查詢zip列所有的字母部分 (常考)
select zip,regexp_replace(zip,'[^a-zA-Z]')
from person;
--查詢zip列所有的數字部分 (常考)
select zip,regexp_replace(zip,'[^0-9]')
from person;
(3)replace_instr 使用正則表達式返回搜索模式的起點和終點(整數)
3.regexp_instr(str,匹配模式[,數1[,數2[,數3[,匹配參數]]]]) 查找字符串位置 --返回數值
從第數1位開始找 找第數2次匹配的位置instr(str1,str2[,數1[,數2]])從數1開始,在str1查找str2字符第數2出現的位置
數1 --開始找的位置
數2 --匹配第幾次出現
數3 --非0返回‘匹配的字符串’的最后一位位置的下一個位置,找不到返回0數1 數2不寫默認是1
數3不寫默認從前往后找
數3不寫默認返回字符串中的第一個字符位置,
數3為非0返回字符串最末尾字符的后一位,找不到返回0--查找zip列第一個非數字的字符的位置
select zip,regexp_instr(zip,'[^0-9]') a,regexp_instr(zip,'[^0-9]',2,1,0) b,regexp_instr(zip,'[^0-9]',2,1,4) c,--第二位找第一次出現的后一位regexp_instr(zip,'[^0-9]',1,1) d,regexp_instr(zip,'[^0-9]',5,1) e,regexp_instr(zip,'[^0-9]',5,1,7) f
from person;--查找zip列第二次出現"字母和數字的組合"的位置(匹配字符串的第一個字符的位置)
select zip,regexp_instr(zip,'[a-zA-Z][0-9]',1,2)
from person;--查找email列'@'第一次出現的位置, '.' 第一次出現的位置, 標點符號第一次出現的位置
select email,regexp_instr(email,'@'),regexp_instr(email,'\.',1,1,0),regexp_instr(email,'[:.:]',1,1,0),regexp_instr(email,'[[:punct:]]')
from person;
(4)replace_substr 使用正則表達式返回指定返回串的起點和終點
regexp_substr(str,匹配模式[,數1[,數2[,匹配參數]]]) 截取字符串substr(str,數1[,數2]) 從str中的第數1為截取數2位長度的字符 數1 從第幾位開始找
數2 第幾次匹配
從數1位開始找 截取第數2次匹配的字符串
數1 數2不寫默認是1--截取zip列第一個"數字+字母"的組合
select zip,regexp_substr(zip,'[0-9][a-z]',1,1,'i') a,regexp_substr(zip,'[0-9][a-zA-Z]')
from person; --截取zip列第一個連續的字母串
select zip, regexp_substr(zip,'[a-zA-Z][a-zA-Z]+',1,1),regexp_substr(zip,'[a-zA-Z]{2,}',1,1),regexp_substr(zip,'[a-z]{2,}',1,1,'i')
from person;
--截取'i love http://www.52oracle.com'第一次出現o開頭e結尾中間任意四個字符的字符串
select 'i love http://www.52oracle.com',regexp_substr('i love http://www.52oracle.com','o....e')
from dual;
(5)replace_count 統計符合條件的字符出現的次數
regexp_count(source_char, pattern , position , match_param)
source:需要用來進行分析的字符串
pattern:字符(可以是正常字母數字等 a,1 等,也可以是正則表達式 /d /w [a-z]等),整個函數的作用就是返回pattern在source中出現的次數值。
position:從字符串的那個位置開始分析,可以省略,默認值是1
match_param:匹配參數
匹配參數
‘i’ 用于不區分大小寫的匹配
‘c’ 用于區分大小寫的匹配
‘n’ 允許句點(.)作為通配符去匹配換行符。如果省略該參數,則句點將不匹配換行符
‘m’ 將源串視為多行。即Oracle 將^和$分別看作源串中任意位置任何行的開始和結束,而不是僅僅看作整個源串的開始或 結束。如果省略該參數,則Oracle將源串看作一行。
‘x’ 忽略空格字符。默認情況下,空格字符與自身相匹配。select regexp_count('hello-world','o') from dual