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次.
\num 匹配 num,其中 num 是一个正整数.对所获取的匹配的引用.
正则表达式的一个很有用的特点是可以保存子表达式以后使用,被称为Backreferencing. 允许复杂的替换能力
如调整一个模式到新的位置或者指示被代替的字符或者单词的位置. 被匹配的子表达式存储在临时缓冲区
中,缓冲区从左到右编号, 通过\数字符号访问. 下面的例子列出了把名字 aa bb cc 变成cc, bb, aa.
REGEXP_REPLACE('ELLENHILDISMIT
cc, bb, aa
'\' 转义符.
字符簇:
[[:alpha:]] 任何字母.
[[:digit:]] 任何数字.
[[:alnum:]] 任何字母和数字.
[[:space:]] 任何白字符.
[[:upper:]] 任何大写字母.
[[:lower:]] 任何小写字母.
[[unct:]] 任何标点符号.
各种操作符的运算优先级
\ 转义符
(), (?, (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \anymetacharacter 位置和顺序
| "或"操作
--测试数据
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('abcxy');
insert into test values('The final test is is is how to find duplicate words.');
commit;
第一段:REGEXP_LIKE
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('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('aababcde','^a.*b') FROM DUAL;
第四段:REGEXP_REPLACE
函数格式如下:
function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
__srcstr :需要进行正则处理的字符串
__pattern :进行匹配的正则表达式
__position :起始位置,从第几个字符开始正则表达式匹配(默认为1)
__occurrence :标识第几个匹配组,默认为1
__modifier :模式('i'不区分大小写进行检索;'c'区分大小写进行检索.默认为'c'.)
用 Oracle Database 10g 使用正规表达式
您可以使用最新引进的 Oracle SQL REGEXP_LIKE 操作符和 REGEXP_INSTR、REGEXP_SUBSTR 以及 REGEXP_REPLACE 函数来发挥正规表达式的作用.您将体会到这个新的功能如何对 LIKE 操作符和 INSTR、SUBSTR 和 REPLACE 函数进行了补充.实际上,它们类似于已有的操作符,但现在增加了强大的模式匹配功能.被搜索的数据可以是简单的字符串或是存储在数据库字符列中的大量文本.正规表达式让您能够以一种您以前从未想过的方式来搜索、替换和验证数据,并提供高度的灵活性.
正规表达式的基本例子
默认情况下,一个正规表达式中的一个单独的字符或字符列表只匹配一次.为了指示在一个正规表达式中多次出现的一个字符,您可以使用一个量词,它也被称为重复操作符..如果您想要得到从字母 a 开始并以字母 b 结束的匹配模式,则您的正规表达式看起来像这样:^a.*b$.* 元字符重复前面的元字符 (.) 指示的匹配零次、一次或更多次.LIKE 操作符的等价的模式是 a%b,其中用百分号 (%) 来指示任意字符出现零次、一次或多次.
匹配完整域名的正则表达式:
完整的域名至少包括两个名字(比如google.com,由google和com构成),最后可以有一个表示根域的点(在规范中,最后有一个点的才是完整域名,但一般认为包括两个以上名字的域名也是完整域名,哪怕后面没有点).