Oracle正则表达式

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 
与上面一个例子相比,多了两个参数 

表示从源字符串的第一个字符开始查找匹配 

表示第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('Tom_Kyte@oracle.com','[^@]+') 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.3其他一些匹配样式 
查找网页地址信息 
SELECT regexp_substr('Go to http://www.oracle.com/products and click on database', 'http://([[:alnum:]]+\.?){3,4}/?') RESULT 

FROM dual 
Output: http://www.oracle.com 
其中: 
http:// 
表示匹配字符串“http://” 
([[:alnum:]]+\.?) 表示匹配1次或者多次字母或数字字符,紧跟0次或1次逗号符 
{3,4} 
表示匹配前面的字符最少3次,最多4次 
/? 
表示匹配一个反斜杠字符0次或者1次 


提取csv字符串中的第三个值 
SELECT regexp_substr('1101,Yokohama,Japan,1.5.105', '[^,]+', 1, 3) AS output 

FROM dual; 
Output: Japan 
其中: 
[^,]+ 
表示匹配1个或者多个不是逗号的字符 

表示从源字符串的第一个字符开始查找匹配 

表示第3次匹配到的字符串 
注:这个通常用来实现字符串的列传行 
--字符串的列传行 
SELECT regexp_substr('1101,Yokohama,Japan,1.5.105', '[^,]+', 1, LEVEL) AS output 

FROM dual 
CONNECT BY LEVEL <= length('1101,Yokohama,Japan,1.5.105') - 

length(REPLACE('1101,Yokohama,Japan,1.5.105', ',')) + 1; 
Output: 1101 

Yokohama 
Japan 
1.5.105 
这里通过LEVEL来循环截取匹配到的字符串。 


下面这个例子,查找源字符串中是否包含 kid 、kids或者kidding 这三个字符串 
SELECT CASE 

WHEN regexp_like('Why does a kid enjoy kidding with kids only?', 

'kid(s|ding)*', 

'i') THEN 

'Match Found' 

ELSE 

'No Match Found' 

END AS output 

FROM dual; 
Output: Match Found 
其中: 
kid 
表示字符串kid 
(s|ding)* 
表示匹配0次或者多次字符“s”或者“ding” 

表示不区分大小写 
2. 
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,模式出现的时候,要返回什么内容。 
具体如下面的例子所示: 
--如果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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值