正则表达式

  正则表达式,英文名是:Regular Expression。直译就是有规律的表达式,整齐的表达式。什么是表达式?表达式,是由数字、算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合。归根到底,正则表达式也是表达式的一种,它是什么样的表达式呢?有规律的表达式。然后在看看正则表达式的用途——字符串处理。所以,什么是正则表达式?正则表达式就是匹配出符合特定规律的字符串的符号组合。

Oracle SQL

  下表是正则表达式部分元字符的解释(符合POSIX标准):

^           

使表达式定位至一行的开头

$

使表达式定位至一行的末尾

*

匹配 0 次或更多次

?

匹配 0 次或 1 次

+

匹配 1 次或更多次

{m}

正好匹配 m 次

{m,}

至少匹配 m 次

{m,n}

至少匹配 m 次但不超过 n 次

[:alpha:]

字母字符

[:lower:]

小写字母字符

[:upper:]

大写字母字符

[:digit:]

数字

[:alnum:]

字母数字字符

[:space:]

空白字符(禁止打印),如回车符、换行符、竖直制表符和换页符

[:punct:]

标点字符

...)

将子表达式分组为一个替换单元、量词单元或后向引用单元  

[...]      

匹配列表中的字符

[^...]

匹配不在列表中的字符

  Oracle提供了四个支持正则表达式的函数REGEXP_LIKE , REGEXP_REPLACE , REGEXP_INSTR , REGEXP_SUBSTR 。

  REGEXP_LIKE:比较一个字符串是否与正则表达式匹配  

    (srcstr, pattern [, match_option])  

  REGEXP_INSTR:在字符串中查找正则表达式,并且返回匹配的位置 

    (srcstr, pattern [, position [, occurrence [, return_option [, match_option]]]])  

  REGEXP_SUBSTR:返回与正则表达式匹配的子字符串  

    (srcstr, pattern [, position [, occurrence [, match_option]]])    

  REGEXP_REPLACE:搜索并且替换匹配的正则表达式  

    (srcstr, pattern [, replacestr [, position [, occurrence [, match_option]]]])

  其中各参数的含义为:

  srcstr: 被查找的字符数据,可以是列和绑定变量等   

  pattern: 正则表达式。  

  occurrence: 出现的次数。默认为1。  

  position: 开始位置  

return_option: 默认值为0,返回该模式的起始位置;值为1则返回符合匹配条件的下一个字符的起始位置。  

replacestr:    用来替换匹配模式的字符串。  

match_option:  匹配方式选项。缺省为c。  

               c:case sensitive  

               I:case insensitive 

               n:(.)匹配任何字符(包括newline)  

               m:字符串存在换行的时候被作为多行处理

下面提供一些实例,推荐使用 PLSQL Developer ,CMD实在是有点揪心。

首先创建测试表TEST,并插入测试数据:

create table test (c1 int , testcol varchar2(100));
insert into test values(100,'10d6h2');
insert into test values(110,'100025');
insert into test values(120,'gift');
insert into test values(130,'01083697902');
insert into test values(140,'010-400-7591');
insert into test values(150,'ab c de');
insert into test values(160,'abcde');
insert into test values(170,'tianjie@oracle.com'|| chr(10) ||'liuy@sina.com.cn');
insert into test values(180,'Steven');
insert into test values(190,'bac');
insert into test values(200,'Stephen');
commit;

一、REGEXP_LIKE测试

1. 找到表中testcol列只包含数字的记录

select * from test where regexp_like(testcol,'^[0-9]+$');

2. 找到表中testcol列只包含6个数字的记录

select * from test where regexp_like(testcol,'^[0-9]{6}$');

3. 当然上面2的语句也可以使用下面的写法

select * from test where regexp_like(testcol,'^\d{6}$');

4. 找到表中testcol列包含以Ste开头,中间是v或者是ph,以en结尾的字符串记录

select * from test where regexp_like(testcol,'^Ste(v|ph)en$');

5. 上面的语句默认是区分大小写的,如果要不区分大小写的话,可以考虑使用'i'

select * from test where regexp_like(testcol,'^ste(v|ph)en$');

select * from test where regexp_like(testcol,'^ste(v|ph)en$','i');

 

to be continued...

posted @ 2014-12-07 11:26  ddhjy  阅读(162)  评论(0编辑  收藏  举报