首页 > 代码库 > 正则表达式

正则表达式

  正则表达式,英文名是: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...

正则表达式