需求:
匹配手机号,第一位可以是+,可以没有+,后面的全部要是数字,如:
+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