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