Oracle 正则表达式

 

ORACLE中的支持正则表达式的函数主要有下面四个:
1,REGEXP_LIKE :与LIKE的功能相似
2,REGEXP_INSTR :与INSTR的功能相似
3,REGEXP_SUBSTR :与SUBSTR的功能相似
4,REGEXP_REPLACE :与REPLACE的功能相似
它们在用法上与Oracle SQL 函数LIKE、INSTR、SUBSTR 和REPLACE 用法相同,
但是它们使用POSIX 正则表达式代替了老的百分号( %)和通配符(_)字符。
POSIX 正则表达式由标准的元字符(metacharacters)所构成:
' ^ ' 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。
' $ ' 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹
配  ' \n ' 或  ' \r '
' . ' 匹配除换行符之外的任何单字符。
' ? ' 匹配前面的子表达式零次或一次。
' + ' 匹配前面的子表达式一次或多次。
' * ' 匹配前面的子表达式零次或多次。
' | ' 指明两项之间的一个选择。例子 ' ^([a-z]+|[0-9]+)$ '表示所有小写字母或数字组合成的
字符串。
' ( ) ' 标记一个子表达式的开始和结束位置。
' [] ' 标记一个中括号表达式。
' {m,n} ' 一个精确地出现次数范围,m =<出现次数 <=n, ' {m} '表示出现m次, ' {m,} '表示至少
出现m次。
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。
字符簇: 
[ [:alpha: ]] 任何字母。
[ [:digit: ]] 任何数字。
[ [:alnum: ]] 任何字母和数字。
[ [:space: ]] 任何白字符。
[ [:upper: ]] 任何大写字母。
[ [:lower: ]] 任何小写字母。
[ [:punct: ]] 任何标点符号。
[ [:xdigit: ]] 任何16进制的数字,相当于 [ 0-9a-fA-F ]
各种操作符的运算优先级
\转义符
(), (?:), (? =),  [] 圆括号和方括号
*+, ?, {n}, {n,}, {n,m} 限定符
^, $, anymetacharacter 位置和顺序
| 
*/
-- 创建表
create  table fzq
(
id  varchar( 4),
value  varchar( 10)
);
-- 数据插入
insert  into fzq  values
( ' 1 ', ' 1234560 ');
insert  into fzq  values
( ' 2 ', ' 1234560 ');
insert  into fzq  values
( ' 3 ', ' 1b3b560 ');
insert  into fzq  values
( ' 4 ', ' abc ');
insert  into fzq  values
( ' 5 ', ' abcde ');
insert  into fzq  values
( ' 6 ', ' ADREasx ');
insert  into fzq  values
( ' 7 ', ' 123 45 ');
insert  into fzq  values
( ' 8 ', ' adc de ');
insert  into fzq  values
( ' 9 ', ' adc,.de ');
insert  into fzq  values
( ' 10 ', ' 1B ');
insert  into fzq  values
( ' 10 ', ' abcbvbnb ');
insert  into fzq  values
( ' 11 ', ' 11114560 ');
insert  into fzq  values
( ' 11 ', ' 11124560 ');
-- regexp_like
--
查询value中以1开头60结束的记录并且长度是7位
select  *  from fzq  where value  like  ' 1____60 ';
select  *  from fzq  where regexp_like(value, ' 1....60 ');
-- 查询value中以1开头60结束的记录并且长度是7位并且全部是数字的记录。
--
使用like就不是很好实现了。
select  *  from fzq  where regexp_like(value, ' 1[0-9]{4}60 ');
--  也可以这样实现,使用字符集。
select  *  from fzq  where regexp_like(value, ' 1[[:digit:]]{4}60 ');
--  查询value中不是纯数字的记录
select  *  from fzq  where  not regexp_like(value, ' ^[[:digit:]]+$ ');
--  查询value中不包含任何数字的记录。
select  *  from fzq  where regexp_like(value, ' ^[^[:digit:]]+$ ');
-- 查询以12或者1b开头的记录.不区分大小写。
select  *  from fzq  where regexp_like(value, ' ^1[2b] ', ' i ');
-- 查询以12或者1b开头的记录.区分大小写。
select  *  from fzq  where regexp_like(value, ' ^1[2B] ');
--  查询数据中包含空白的记录。
select  *  from fzq  where regexp_like(value, ' [[:space:]] ');
-- 查询所有包含小写字母或者数字的记录。
select  *  from fzq  where regexp_like(value, ' ^([a-z]+|[0-9]+)$ ');
-- 查询任何包含标点符号的记录。
select  *  from fzq  where regexp_like(value, ' [[:punct:]] ');


 

正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。

用户名: /^ [ a-z0-9_- ]{ 3, 16}$ /

密码: /^ [ a-z0-9_- ]{ 6, 18}$ /

十六进制值: /^#?( [ a-f0-9 ]{ 6} | [ a-f0-9 ]{ 3})$ /

电子邮箱: /^( [ a-z0-9_\.- ] +)@( [ \da-z\.- ] +)\.( [ a-z\. ]{ 2, 6})$ /

URL: /^(https?:\ /\ /)?( [ \da-z\.- ] +)\.( [ a-z\. ]{ 2, 6})( [ \/\w \.- ] *) *\ /?$ /

IP 地址: /^(?:(?: 25 [ 0-5 ] | 2 [ 0-4 ][ 0-9 ] | [ 01 ]? [ 0-9 ][ 0-9 ]?)\.){ 3}(?: 25 [ 0-5 ] | 2 [ 0-4 ][ 0-9 ] | [ 01 ]? [ 0-9 ][ 0-9 ]?)$ /

HTML 标签: /^<( [ a-z ] +)( [ ^< ] +) *(?: >(. *) <\ /\ 1 >|\s +\ />)$ /

Unicode编码中的汉字范围: /^ [ u4e00-u9fa5 ],{ 0,}$ /

匹配中文字符的正则表达式:  [ \u4e00-\u9fa5 ]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内): [ ^\x00-\xff ]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:\n\s *\r
评注:可以用来删除空白行

匹配HTML标记的正则表达式: <(\S *?) [ ^> ] *>. *? </\ 1 >|<. */>
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式: ^\s *|\s *$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:\w +( [ -+. ]\w +) *@\w +( [ -. ]\w +) *\.\w +( [ -. ]\w +) *
评注:表单验证时很实用

匹配网址URL的正则表达式: [ a-zA-z ] +: // [ ^\s ] *
评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5 -16字节,允许字母数字下划线): ^ [ a-zA-Z ][ a-zA-Z0-9_ ]{ 4, 15}$
评注:表单验证时很实用

匹配国内电话号码:\d{ 3} -\d{ 8} |\d{ 4} -\d{ 7}
评注:匹配形式如  0511 - 4405222 或  021 - 87888822

匹配腾讯QQ号: [ 1-9 ][ 0-9 ]{ 4,}
评注:腾讯QQ号从10000开始

匹配中国大陆邮政编码: [ 1-9 ]\d{ 5}(?!\d)
评注:中国大陆邮政编码为6位数字

匹配身份证:\d{ 15} |\d{ 18}
评注:中国大陆的身份证为15位或18位

匹配ip地址:\d +\.\d +\.\d +\.\d +
评注:提取ip地址时有用

匹配特定数字:
^ [ 1-9 ]\d *$     //匹配正整数
^- [ 1-9 ]\d *$    //匹配负整数
^-? [ 1-9 ]\d *$    //匹配整数
^ [ 1-9 ]\d *| 0$   //匹配非负整数(正整数  +  0
^- [ 1-9 ]\d *| 0$    //匹配非正整数(负整数  +  0
^ [ 1-9 ]\d *\.\d *| 0\.\d * [ 1-9 ]\d *$    //匹配正浮点数
^-( [ 1-9 ]\d *\.\d *| 0\.\d * [ 1-9 ]\d *)$   //匹配负浮点数
^-?( [ 1-9 ]\d *\.\d *| 0\.\d * [ 1-9 ]\d *| 0?\. 0 +| 0)$   //匹配浮点数
^ [ 1-9 ]\d *\.\d *| 0\.\d * [ 1-9 ]\d *| 0?\. 0 +| 0$    //匹配非负浮点数(正浮点数  +  0
^( -( [ 1-9 ]\d *\.\d *| 0\.\d * [ 1-9 ]\d *)) | 0?\. 0 +| 0$   //匹配非正浮点数(负浮点数  +  0
评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:
^ [ A-Za-z ] +$   //匹配由26个英文字母组成的字符串
^ [ A-Z ] +$   //匹配由26个英文字母的大写组成的字符串
^ [ a-z ] +$   //匹配由26个英文字母的小写组成的字符串
^ [ A-Za-z0-9 ] +$   //匹配由数字和26个英文字母组成的字符串
^\w +$   //匹配由数字、26个英文字母或者下划线组成的字符串

去除精度纬度中非浮点数

  select jd,wd  from xx_xa_xsczaqpc t  where t.id  not  in  (

select id  from xx_xa_xsczaqpc  where regexp_like(jd, ' ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ ')) ; 

是双小数点的数

select xx_jbxx_id,jd,wd  from xx_xa_xsczaqpc t  where regexp_like(jd, ' ^[1-9]\d*\.\d*\.\d*[1-9]\d*$ '

 

转载于:https://www.cnblogs.com/zq281660880/archive/2013/03/22/2975995.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值