Oracle正则表达式(一)

2014-11-24 18:43:55 · 作者: · 浏览: 0

需求:


匹配手机号,第一位可以是+,可以没有+,后面的全部要是数字,如:


+861359415665


8613659558555


1356856455


都是合法的。



+aa156945555


aa1359556666


aaddssdfdfsd


都是不合法的。


正则:


[sql]


解释:


1.^代表开始,*表示出现0次或多次,+表示出现1次或多次,[:digit:]代表0-9的纯数字(还有$代表以什么结尾,如果是[[:digit:]]+$代表以数字结尾)。该正则的意思就是:


以+0次或多次开头,紧接着后面数字出现一次或多次(即一定要有数字)。


2.dual表中,永远只有1行记录。查询出dual中有记录,证明where条件成立,反之不成立。


先前写了一个错误的正则:


注意,就只少了一个代表开始符号的^。少了这个符号,说明这个正则的意思是:


+出现0次或多次(即+可以出现,可以不出现!!),紧后面的数字出现1次或多次。前面已经+可以出现0次了,证明没有+也可以,那么就是只要字符串中有数字(+aa111a,aass11111……),这个正则恒成立,错误深重啊!!


在oracle里正则表达式有四个函数可用,分别是regexp_like、regexp_substr、regexp_instr 和regexp_replace。这里在我们oracle 10g里灵活应用。


先来简单介绍一下正则表达式的内容,正则表达式是做为快速查询的文本内容的,在linux应用比较多,首先,行的起始与结束 “^”这个字符是表示只查找行首的内容。“$”这个字符只查找行末的内容。接下来是“^”还可以做为一个排除字符来使用。还是使用例子来做一个演示比较明了一下。


这里我使用regexp_like这个函数来做,这样可以我们平时会使用的比较多。


select * from test_table


where regexp_like(field_1,'^1234')


这个就是表示是以1234打头的字符串是不是有匹配的。这里和like的方式是一样的。




select * from test_table


where regexp_like(field_1,'^[12]234')


这里多了一个[]这里做一个独立字符,这里表示是以1或2开始,并且接着是234这个里的字符就会是匹配的。




select * from test_table


where regexp_like(field_1,'^(欧阳|李)小二')


这里我们就可以表达,这个查询一个姓是欧阳或李的,名字叫小二的字符串。这里多了一个()这个是做一个为字符串的方式来写的与[]刚好是对应。


这里还有一个“|”来表示或的意思。




select * from test_table


where regexp_like(field_1,'^李[小]*二')


这里我们就可以查询李小二或是李二,再或者是李小小二,都可以,这里我们需要讲一下是[]后面带了一个*,这个是表示0~无穷大 字符去匹配。这个[]我们还可以添加一个“+”来表示1~无穷大的字符去匹配,也可以更加精准一些,在[]后面{1,3}这里就是表示1个到3个相同字符的匹配。还有一个“ ”来说表示1或是0个。




select * from test_table


where regexp_like(field_1,'李[^小]二')


这里我们可以查询到姓李的,但是第二字不是“小”这个字。




select * from test_table


where regexp_like(field_1,'[0-9]')


这里是表示我们查询字符串含有0-9的数字的字符串。




select * from test_table


where regexp_like(field_1,'[a-z]')


这里是表示我们查询字符串含有a-z的小写字母的字符串。




select * from test_table


where regexp_like(field_1,'[A-z]')


这里是表示我们查询字符串含有A-z的所有字母的字符串。




select * from test_table


where regexp_like(name,'[[:alpha:]]')


这里是表示查询匹配任意字母,也包括中文字




select * from test_table


where regexp_like(name,'[[:alnum:]]')


这里是表示查询匹配任意字母和数字




select * from test_table


where regexp_like(name,'[[:digit:]]')


这里是表示查询匹配任意数字




Select * from test_table


Where regexp_like(name,’of’,’i’)


这里就是of不区分大小写




Select * from test_table


Where regexp_like(name,’^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$’)


这样我们可以查询是不是ip格式





接下来介绍一下regexp_substr


这个也是一个非常实用的一个函数



REGEXP_SUBSTR与SUBSTR函数相同,返回截取的子字符串


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


注:


srcstr 源字符串


pattern 正则表达式样式


position 开始匹配字符位置


occurrence 匹配出现次数


match_option 匹配选项(区分大小写)




SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+') FROM dual;


Output: 1PSN


[[:alnum:]]+ 表示匹配1个或者多个字母或数字字符




SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+', 1, 2) FROM dual;


Output: 231


与上面一个例子相比,多了两个参数


1 表示从源字符串的第一个字符开始查找匹配


2 表示第2次匹配到的字符串(默认值是“1”,如上例)




select regexp_substr('@@/231_3253/ABc','@*[[:alnum:]]+') from dual;


Output: 231


@* 表示匹配0个或者多个@


[[:alnum:]]+ 表示匹配1个或者多个字母或数字字符


注意:需要区别“+”和“*”的区别




select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]*') from dual;


Output: @


@+ 表示匹配1个或者多个@


[[:alnum:]]* 表示匹配0个或者多个字母或数字字符




select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from dual;


Output: Null


@+ 表示匹配1个或者多个@


[[:alnum:]]+ 表示匹配1个或者多个字母或数字字符




select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from dual;


Output: 125


[[:digit:]]+$ 表示匹配1个或者多个数字结尾的字符




selec