oracle怎么写正则 oracle 正则表达式纯字母

oracle 正则表达式selectregexp_replace('If IsValid("date", to_date(Trim(LK_01.TX_DATE) Then"19111111"then ','if\s isvalid.*\((.*?)\).*?then','\1 ',1,0,'i')from dual;
这样的话就是得出LK_01.TX_DATE这个结果啦
嘻嘻
oracle 的正则表达式oracle的正则表达式(10g才可以用)
oracle的正则表达式(regular expression)简单介绍
目前,正则表达式已经在很多软件中得到广泛的应用 , 包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境 。
Oracle 10g正则表达式提高了SQL灵活性 。有效的解决了数据有效性 , 重复词的辨认, 无关的空白检测 , 或者分解多个正则组成的字符串等问题 。
Oracle 10g支持正则表达式的四个新函数分别是:REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、和REGEXP_REPLACE 。
它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符 。
特殊字符:
'^' 匹配输入字符串的开始位置 , 在方括号表达式中使用 , 此时它表示不接受该字符集合 。
'$' 匹配输入字符串的结尾位置 。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或'\r' 。
'.' 匹配除换行符 \n之外的任何单字符 。
'?' 匹配前面的子表达式零次或一次 。
'*' 匹配前面的子表达式零次或多次 。
' ' 匹配前面的子表达式一次或多次 。
'( )' 标记一个子表达式的开始和结束位置 。
'[]' 标记一个中括号表达式 。
'{m,n}' 一个精确地出现次数范围,m=出现次数=n,'{m}'表示出现m次,'{m,}'表示至少出现m次 。
'|' 指明两项之间的一个选择 。例子'^([a-z] |[0-9] )$'表示所有小写字母或数字组合成的字符串 。
\num 匹配 num,其中 num 是一个正整数 。对所获取的匹配的引用 。
正则表达式的一个很有用的特点是可以保存子表达式以后使用,被称为Backreferencing. 允许复杂的替换能力
如调整一个模式到新的位置或者指示被代替的字符或者单词的位置. 被匹配的子表达式存储在临时缓冲区
【oracle怎么写正则 oracle 正则表达式纯字母】中,缓冲区从左到右编号, 通过\数字符号访问 。下面的例子列出了把名字 aa bb cc 变成cc, bb, aa.
Select REGEXP_REPLACE('aa bb cc','(.*) (.*) (.*)', '\3, \2, \1') FROM dual;
REGEXP_REPLACE('ELLENHILDISMIT
cc, bb, aa
'\' 转义符 。
字符簇:
[[:alpha:]] 任何字母 。
[[:digit:]] 任何数字 。
[[:alnum:]] 任何字母和数字 。
[[:space:]] 任何白字符 。
[[:upper:]] 任何大写字母 。
[[:lower:]] 任何小写字母 。
[[unct:]] 任何标点符号 。
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F] 。
各种操作符的运算优先级
\ 转义符
(), (?, (?=), [] 圆括号和方括号
*,, ?, {n}, {n,}, {n,m} 限定符
^, $, \anymetacharacter 位置和顺序
| “或”操作
--测试数据
create table test(mc varchar2(60));
insert into test values('112233445566778899');
insert into test values('22113344 5566778899');
insert into test values('33112244 5566778899');
insert into test values('44112233 5566 778899');
insert into test values('5511 2233 4466778899');
insert into test values('661122334455778899');
insert into test values('771122334455668899');
insert into test values('881122334455667799');
insert into test values('991122334455667788');
insert into test values('aabbccddee');
insert into test values('bbaaaccddee');
insert into test values('ccabbddee');
insert into test values('ddaabbccee');
insert into test values('eeaabbccdd');
insert into test values('ab123');
insert into test values('123xy');
insert into test values('007ab');
insert into test values('abcxy');
insert into test values('The final test is is is how to find duplicate words.');
commit;
一、REGEXP_LIKE
select * from test where regexp_like(mc,'^a{1,3}');
select * from test where regexp_like(mc,'a{1,3}');
select * from test where regexp_like(mc,'^a.*e$');
select * from test where regexp_like(mc,'^[[:lower:]]|[[:digit:]]');
select * from test where regexp_like(mc,'^[[:lower:]]');
Select mc FROM test Where REGEXP_LIKE(mc,'[^[:digit:]]');
Select mc FROM test Where REGEXP_LIKE(mc,'^[^[:digit:]]');
二、REGEXP_INSTR
Select REGEXP_INSTR(mc,'[[:digit:]]$') from test;
Select REGEXP_INSTR(mc,'[[:digit:]] $') from test;
Select REGEXP_INSTR('The price is $400.','\$[[:digit:]] ') FROM DUAL;
Select REGEXP_INSTR('onetwothree','[^[[:lower:]]]') FROM DUAL;
Select REGEXP_INSTR(',,,,,','[^,]*') FROM DUAL;
Select REGEXP_INSTR(',,,,,','[^,]') FROM DUAL;
三、REGEXP_SUBSTR
SELECT REGEXP_SUBSTR(mc,'[a-z] ') FROM test;
SELECT REGEXP_SUBSTR(mc,'[0-9] ') FROM test;
SELECT REGEXP_SUBSTR('aababcde','^a.*b') FROM DUAL;
四、REGEXP_REPLACE
Select REGEXP_REPLACE('Joe Smith','( ){2,}', ',') AS RX_REPLACE FROM dual;
Select REGEXP_REPLACE('aa bb cc','(.*) (.*) (.*)', '\3, \2, \1') FROM dual;
Oracle正则表达式Oracle正则表达式的应用在oracle里正则表达式有四个函数可用,分别是regexp_like、regexp_substr、regexp_instr 和regexp_replace 。这里在我们oracle 10g里灵活应用 。先来简单介绍一下正则表达式的内容,正则表达式是做为快速查询的文本内容的,在linux应用比较多,首先 , 行的起始与结束 “^”这个字符是表示只查找行首的内容 。“$”这个字符只查找行末的内容 。接下来是“^”还可以做为一个排除字符来使用 。还是使用例子来做一个演示比较明了一下 。这里我使用regexp_like这个函数来做,这样可以我们平时会使用的比较多 。select * from test_tablewhere regexp_like(field_1,'^1234')这个就是表示是以1234打头的字符串是不是有匹配的 。这里和like的方式是一样的 。select * from test_tablewhere regexp_like(field_1,'^[12]234')这里多了一个[]这里做一个独立字符 , 这里表示是以1或2开始 , 并且接着是234这个里的字符就会是匹配的 。select * from test_tablewhere regexp_like(field_1,'^(欧阳|李)小二')这里我们就可以表达 , 这个查询一个姓是欧阳或李的 , 名字叫小二的字符串 。这里多了一个()这个是做一个为字符串的方式来写的与[]刚好是对应 。这里还有一个“|”来表示或的意思 。select * from test_tablewhere regexp_like(field_1,'^李[小]*二')这里我们就可以查询李小二或是李二 , 再或者是李小小二,都可以,这里我们需要讲一下是[]后面带了一个*,这个是表示0~无穷大 字符去匹配 。这个[]我们还可以添加一个“ ”来表示1~无穷大的字符去匹配,也可以更加精准一些,在[]后面{1,3}这里就是表示1个到3个相同字符的匹配 。还有一个“?”来说表示1或是0个 。select * from test_tablewhere regexp_like(field_1,'李[^小]二')这里我们可以查询到姓李的,但是第二字不是“小”这个字 。select * from test_tablewhere regexp_like(field_1,'[0-9]')这里是表示我们查询字符串含有0-9的数字的字符串 。select * from test_tablewhere regexp_like(field_1,'[a-z]')这里是表示我们查询字符串含有a-z的小写字母的字符串 。select * from test_tablewhere regexp_like(field_1,'[A-z]')这里是表示我们查询字符串含有A-z的所有字母的字符串 。select * from test_tablewhere regexp_like(name,'[[:alpha:]]')这里是表示查询匹配任意字母 , 也包括中文字select * from test_tablewhere regexp_like(name,'[[:alnum:]]')这里是表示查询匹配任意字母和数字select * from test_tablewhere regexp_like(name,'[[:digit:]]')这里是表示查询匹配任意数字Select * from test_tableWhere regexp_like(name,’of’,’i’)这里就是of不区分大小写Select * from test_tableWhere 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个或者多个数字结尾的字符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个或者多个数字结尾的字符select regexp_substr('@1PSN/231_3253/ABc','[^[:digit:]] $') from dual; Output: /ABc [^[:digit:]] $ 表示匹配1个或者多个不是数字结尾的字符select regexp_substr('Tom_Kyte@oracle.com','[^@] ') from dual; Output: Tom_Kyte [^@]表示匹配1个或者多个不是“@”的字符select regexp_substr('1PSN/231_3253/ABc','[[:alnum:]]*',1,2) from dual; Output: Null [[:alnum:]]* 表示匹配0个或者多个字母或者数字字符注:因为是匹配0个或者多个,所以这里第2次匹配的是“/”(匹配了0次),而不是“231”,所以结果是“Null”这里我们有时候会查询字符串里asdfafdmaindafda 这里我们要取出main这个字符串Select regexp_substr('asdfafdmaindafda','[^] ') from dualOutput: main 这里我们在中间去一个^这样在匹配之后,在向后查询的时候确保在匹配到之前不再在有,不然的话就要有可以出错的情况 。Select regexp_substr('asdfafdmaindafda','[^] ') from dualOutput: mainda在这个例子中,我们在main之后还在da , 这样的话,如果我们没有添加^ , 正则表达式就会向后继续去匹配,直到最后一个为至,这样就会出现偏差这个通常用来实现字符串的列传行select regexp_substr('123;234;345;456;567;678;789','[^;] ',1,rownum) from dualconnect by rownum = length('123;234;345;456;567;678;789') - length(replace('123;234;345;456;567;678;789',';')) 1这里length这里操作是先得到有多少个“;”,再通过 connect by rownum方式来做一行成多行的操作,在变成多行之后,可以通过regexp_substr来取字符串的操作接着上一个例子a,b,c,d,e,d,f,a,n这样的一个字符串,我们现在要把字符串里一些重复去掉,这样的话结果是a,b,c,d,e,f,n去掉了d与a的两个字符串select wm_concat(new_row) from (select distinct regexp_substr('a,b,c,d,e,d,f,a,n','[^,] ',1,rownum) new_row from dualconnect by rownum=length('a,b,c,d,e,d,f,a,n')-length(replace('a,b,c,d,e,d,f,a,n',',')))通过转成多行的,再用distinct 去掉重复,然后我们再通过wm_concat来字符串合并来完成 。再来一个ip格式转换的例子吧,我们一般的IP的格式是12.19.168.27现在要不足3位的补足前面为0,结果是012.019.168.027select wm_concat(new_value) from (select lpad(regexp_substr('12.19.168.27','[^.] ',1,rownum) ,3,'0') new_value,rownumfrom dualconnect by rownum5order by rownum)来一个验证IP是数字是否正确select count(*) from(select lpad(regexp_substr('12.19.168.27','[^.] ',1,rownum) ,3,'0') new_value,rownumfrom dualconnect by rownum5)where new_value=https://www.04ip.com/post/0 and new_value256having count(*) =4来一个IP字符串格式转换成数字型IPselect sum(new_value*power(256,4-rm)) from (select regexp_substr('12.19.168.27','[^.] ',1,rownum) new_value,rownum rm from dualconnect by rownum=4)接下来介绍一个regexp_instr函数 REGEXP_INSTR 函数使用正则表达式返回搜索模式的起点和终点 。REGEXP_INSTR 的语法如下所示 。REGEXP_INSTR 返回一个整数,指出搜索模式的开始或结束的位置 , 如果没有发现匹配的值,则返回0 。语法: 2.REGEXP_INSTR与INSTR函数相同 , 返回字符串位置 REGEXP_INSTR(srcstr, pattern [, position [, occurrence [, return_option [,match_option]]]]) 与REGEXP_SUBSTR一样,它也有变量pattern、position(开始位置)、occurrence 和match_parameter;这里主要介绍一下新参数return_option 的作用,它允许用户告诉Oracle , 模式出现的时候 , 要返回什么内容 。Select regexp_instr('asdfafdmaindafda','sd') from dualOutput:2这里去查询sd的位置 , 这个和instr是在相同的Select regexp_instr('asdfafdmaindafda','da',1,2) from dual这里是查询da第二出现的位置 还有我们经常会遇到一种情况是 , 查询某个字段,如果是等于“上海”或“北京”或者我们温州就写成大城市,其它的写成小城市,我们一般会考虑使用decode这种方式 Select decode('上海','上海','大城市','北京' ,'大城市' ,'温州' ,'大城市','小城市') from dual只有两个我们可能觉的sql也不是很冗长,如果有四五个的话,就有点长了,这里使用regexp_instr就可以很多的去操作 Select decode (regexp_instr('北京','^(上海|北京|温州)'),0,'小城市', '大城市') from dual通过regexp_instr不匹配时为0的条件 , 这样就可以完成了最后一个函数regexp_replaceREGEXP_REPLACE 函数是用另外一个值来替代串中的某个值 。例如,可以用一个匹配数字来替代字母的每一次出现 。REGEXP_REPLACE的格式如下所示 语法: 4.REGEXP_REPLACE与REPLACE函数相同,替换原字符串中的字符内容 REGEXP_REPLACE(srcstr, pattern [,replacestr [, position [, occurrence [,match_option]]]])这个替换函数还是一个非常好用的 。如我们在有一个字符串adfadfa (main) next 现在我们要把()替换成 , 这里我们可能想用replace就可以搞定了,但是我们现在做的是(之后必须有)这样的()我们才替换把.select regexp_replace('adfadfa (main) next ','(\()([^\)]*)(\))','\2') from dualoutput: adfadfa main next这里还是一个\做为转义字符 。再来一个ip格式转换的例子吧 , 我们一般的IP的格式是12.19.168.27现在要不足3位的补足前面为0,结果是012.019.168.027select regexp_replace(regexp_replace('12.19.168.27','([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})','00\1.00\2.00\3.00\4') ,'([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}$)','\2\4\6\8')from dualoutput: 012.019.168.027这里我分成两步来操作 , regexp_replace('12.19.168.27','([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})','00\1.00\2.00\3.00\4')我首先让每个小字符串做添加0,这样每个字符串都会大于3,再'([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}$)','\2\4\6\8')这整个字符串分成8段,这样我们只要2、4、6、8这四个段就可以了 。下面一个例子中,在每两个字符之间插入一个空格符SELECT regexp_replace('YAHOO', '(.)', '\1 ') AS output FROM dual; Output: Y A H O O这个用一个循环的方式去操作,还蛮很好的 。select regexp_replace(regexp_replace('12.19.168.27','([^.] )','00\1') ,'([^.]*)([^.]{3})','\2')from dual接着刚才那个,我们可以把replace循环替换的方式来操作 。
oracle怎么写正则的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于oracle 正则表达式纯字母、oracle怎么写正则的信息别忘了在本站进行查找喔 。

    推荐阅读