oracle的正则表达式(regularexpression)简单介绍
目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux,Unix等),HP等操作系统,PHP,C#,Java等开发环境。
Oracle10g正则表达式提高了SQL灵活性。有效的解决了数据有效性,重复词的辨认,无关的空白检测,或者分解多个正则组成
的字符串等问题。
Oracle10g支持正则表达式的四个新函数分别是: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.允许复杂的替换能力
如调整一个模式到新的位置或者指示被代替的字符或者单词的位置.被匹配的子表达式存储在临时缓冲区中,
缓冲区从左到右编号,通过数字符号访问。下面的例子列出了把名字aabbcc变成
cc,bb,aa.
SelectREGEXP_REPLACE('aabbcc','(.*)(.*)(.*)','3,2,1')FROMdual;
REGEXP_REPLACE('ELLENHILDISMIT
cc,bb,aa
''转义符。
字符簇:
[[:alpha:]]任何字母。
[[:digit:]]任何数字。
[[:alnum:]]任何字母和数字。
[[:space:]]任何白字符。
[[:upper:]]任何大写字母。
[[:lower:]]任何小写字母。
[[:punct:]]任何标点符号。
[[:xdigit:]]任何16进制的数字,相当于[0-9a-fA-F]。
各种操作符的运算优先级
转义符
(),(?:),(?=),[]圆括号和方括号
*,+,?,{n},{n,},{n,m}限定符
^,$,anymetacharacter位置和顺序
|或操作
--测试数据
createtabletest(mcvarchar2(60));
insertintotestvalues('112233445566778899');
insertintotestvalues('221133445566778899');
insertintotestvalues('331122445566778899');
insertintotestvalues('441122335566778899');
insertintotestvalues('551122334466778899');
insertintotestvalues('661122334455778899');
insertintotestvalues('771122334455668899');
insertintotestvalues('881122334455667799');
insertintotestvalues('991122334455667788');
insertintotestvalues('aabbccddee');
insertintotestvalues('bbaaaccddee');
insertintotestvalues('ccabbddee');
insertintotestvalues('ddaabbccee');
insertintotestvalues('eeaabbccdd');
insertintotestvalues('ab123');
insertintotestvalues('123xy');
insertintotestvalues('007ab');
insertintotestvalues('abcxy');
insertintotestvalues('Thefinaltestisisishowtofindduplicatewords.');
commit;
一、REGEXP_LIKE
select*fromtestwhereregexp_like(mc,'^a{1,3}');
select*fromtestwhereregexp_like(mc,'a{1,3}');
select*fromtestwhereregexp_like(mc,'^a.*e$');
select*fromtestwhereregexp_like(mc,'^[[:lower:]]|[[:digit:]]');
select*fromtestwhereregexp_like(mc,'^[[:lower:]]');
SelectmcFROMtestWhereREGEXP_LIKE(mc,'[^[:digit:]]');
SelectmcFROMtestWhereREGEXP_LIKE(mc,'^[^[:digit:]]');
二、REGEXP_INSTR
SelectREGEXP_INSTR(mc,'[[:digit:]]$')fromtest;
SelectREGEXP_INSTR(mc,'[[:digit:]]+$')fromtest;
SelectREGEXP_INSTR('Thepriceis$400.','$[[:digit:]]+')FROMDUAL;
SelectREGEXP_INSTR('onetwothree','[^[[:lower:]]]')FROMDUAL;
SelectREGEXP_INSTR(',,,,,','[^,]*')FROMDUAL;
SelectREGEXP_INSTR(',,,,,','[^,]')FROMDUAL;
三、REGEXP_SUBSTR
SELECTREGEXP_SUBSTR(mc,'[a-z]+')FROMtest;
SELECTREGEXP_SUBSTR(mc,'[0-9]+')FROMtest;
SELECTREGEXP_SUBSTR('aababcde','^a.*b')FROMDUAL;
四、REGEXP_REPLACE
SelectREGEXP_REPLACE('JoeSmith','(){2,}',',')ASRX_REPLACEFROMdual;
SelectREGEXP_REPLACE('aabbcc','(.*)(.*)(.*)','3,2,1')FROMdual;
SQLselect*fromtest;
IDMC
--------------------------------------------------------------------------------
AAAAAA
aaaaaa
BBBBBB
bbbbbb
SQLselect*fromtestwhereregexp_like(id,'b','i');--不区分数据大小写
IDMC
--------------------------------------------------------------------------------
BBBBBB
bbbbbb
0 评论:
发表评论