1. 正则表达式规范
(1).匹配字符
字符类
匹配的字符
举 例
\d
从0-9的任一数字
\d\d
匹配
72,
但不匹配
aa
或
7a
\D
任一非数字字符
\D\D\D
匹配
abc,
但不匹配
123
\w
任一单词字符,包括A-Z,a-z,0-9和下划线
\w\w\w\w
匹配
Ab-2
,但不匹配∑
£$%*
或
Ab_@
\W
任一非单词字符
\W
匹配@,但不匹配
a
\s
任一空白字符,包括制表符,换行符,回车符,换页符和垂直制表符
匹配在
HTML,XML
和其他标准定义中的所有传统空白字符
\S
任一非空白字符
空白字符以外的任意字符,如A%&g3;等
.
任一字符
匹配除换行符以外的任意字符除非设置了
MultiLine
先项
[…]
括号中的任一字符
[abc]
将匹配一个单字符
,a,b
或
c.
[a-z]
将匹配从
a
到
z
的任一字符
[^…]
不在括号中的任一字符
[^abc]
将匹配一个
a
、
b
、
c
之外的单字符
,
可以
a,b
或
A
、
B
、
C
[a-z]
将匹配不属于
a-z
的任一字符
,
但可以匹配所有的大写字母
(2).重复字符
重复字符
含 义
举 例
{n}
匹配前面的字符
n
次
x{2}匹配xx,但不匹配x或xxx
{n,}
匹配前面的字符至少
n
次
x{2}匹配2个或更多的x,如xxx,xxx..
{n,m}
匹配前面的字符至少
n
次
,
至多
m
次。如果
n
为
,此参数为可选参数
x{2,4}匹配xx,xxx,xxxx,但不匹配xxxxx
?
匹配前面的字符
次或
1
次,实质上也是可选的
x?匹配x或零个x
+
匹配前面的字符
次或多次
x+匹配x或xx或大于0的任意多个x
*
匹配前面的字符
次或更多次
x*匹配0,1或更多个x
(3).定位字符
定位字符
描 述
^
随后的模式必须位于字符串的开始位置,如果是一个多行字符串,则必须位于行首。对于多行文本(包含回车符的一个字符串)来说,需要设置多行标志
$
前面的模式必须位于字符串的未端,如果是一个多行字符串,必须位于行尾
\A
前面的模式必须位于字符串的开始位置,忽略多行标志
\z
前面的模式必须位于字符串的未端,忽略多行标志
\Z
前面的模式必须位于字符串的未端,或者位于一个换行符前
\b
匹配一个单词边界,也就是一个单词字符和非单词字符中间的点。要记住一个单词字符是
[a-zA-Z0-9]
中的一个字符。位于一个单词的词首
\B
匹配一个非单词字符边界位置,不是一个单词的词首
(4).分组字符
分组字符
定 义
举 例
()
此字符可以组合括号内模式所匹配的字符,它是一个捕获组,也就是说模式匹配的字符作为最终设置了
ExplicitCapture
选项
――
默认状态下字符不是匹配的一部分
输入字符串为:
ABC1DEF2XY
匹配
3
个从
A
到
Z
的字符和
1
个数字的正则表达式:(
[A-Z]{3}\d
)
将产生两次匹配:
Match 1=ABC1;Match 2=DEF2
每次匹配对应一个组:
Match1
的第一个组=
ABC;Match2
的第
1
个组=
DEF
有了反向引用,就可以通过它在正则表达式中的编号以及
C#
和类
Group,GroupCollection
来访问组。如果设置了
ExplicitCapture
选项,就不能使用组所捕获的内容
(5).字符簇:
[[:alpha:]] 任何字母。
[[:digit:]] 任何数字。
[[:alnum:]] 任何字母和数字。
[[:space:]] 任何白字符。
[[:upper:]] 任何大写字母。
[[:lower:]] 任何小写字母。
[[:punct:]] 任何标点符号。
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]。
(6).优先级
转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, anymetacharacter 位置和顺序
¦ “或”操作
2.常用函数
(1).regexp_like(expression, regexp)
返回值为一个布尔值。如果第一个参数匹配第二个参数所代表的正则表达式,那么将返回真,否则将返回假。
(2).regexp_instr(expression, regexp, startindex, times)
返回找到的匹配字符串的位置.
(3).regexp_substr(expression, regexp)
返回第一个字符串参数中,与第二个正则表达式参数相匹配的子字符串。
(4).regexp_replace(expression, regexp, replacement)
将expression中的按regexp匹配到的部分用replacement代替.
(5).REGEXP_COUNT (source_char, pattern [, position [, match_param]])
REGEXP_COUNT 返回pattern 在source_char 串中出现的次数。如果未找到匹配,则函数返回0。position 变量告诉Oracle 在源串的什么位置开始搜索。在开始位置之后每出现一次模式,都会使计数结果增加1。
match_param 变量支持下面几个值:
‘i’ 用于不区分大小写的匹配
‘c’ 用于区分大小写的匹配
‘n’ 允许句点(.)作为通配符去匹配换行符。如果省略该参数,则句点将不匹配换行符
‘m’ 将源串视为多行。即Oracle 将^和$分别看作源串中任意位置任何行的开始和结束,而不是仅仅看作整个源串的开始或结束。如果省略该参数,则Oracle将源串看作一行。
‘x’ 忽略空格字符。默认情况下,空格字符与自身相匹配。
3.示例:
(1).查找id为4位数的记录
select data_object_id,object_name from HH where regexp_like(data_object_id,'^[[:digit:]]{3}$');
select data_object_id,object_name from HH where regexp_like(data_object_id,'^\d{3}$');
(2).查找对象名包含英文和下划线的记录
select object_name from HH where regexp_like(object_name,'^[a-z|A-Z|_]*$')
(3).对象名以a或A开头的记录
select object_name from HH where regexp_like(object_name,'^[a|A]')
(4).查找对象名为全英文,并且以N结尾
select object_name from HH where regexp_like(object_name,'^[a-z|A-Z]*N$')
(5).查找以非数字开头的员工信息
select object_name from HH where regexp_like(object_name,'^[^\d]');
(6).查找对象名中第一个特殊字符的位置
select object_name,regexp_instr(object_name,'[^[:alnum:]]',1) from HH;
(7).从第三个字符开始,查找员工编号中第二个非数字字符的位置
select object_name,regexp_instr(object_name,'[^[:alnum:]]',3,2) from HH
(8).返回从第二个字符开始检索,并且对象名以L开头$结尾的子串
select object_name,regexp_substr(object_name,'L.*\$$',2) from HH;
(9).把对象名中所有非字母字符替换为“A”
select regexp_replace(object_name,'[^a-z|A-Z]','A') from HH;
(10).查询字符串中was的出现次数,忽略大小写。
select regexp_count ('THE PRO-NIECE WAS BORN TODAY, SO EXCITING!', 'Was', 1,'i') from dual;