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 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个或者多个不是逗号的字符 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 --------原文网址: http://www.itpub.net/thread-1345477-1-1.html