oracle的正则表达式
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之外的任何单字符。
'?' 匹配前面的子表达式零次或一次。
'*' 匹配前面的子表达式零次或多次。
select regexp_replace('dsfsdfsf','a*','A')from dual AdAsAfAsAdAfAsAfA
因为其可以匹配a没有出现的地方,所以在每个字符前面和后面都会插A,相当于将两个字符中间的空位也当做一次匹配
select regexp_replace('adsfsdfsf','a*','A')from dual AAdAsAfAsAdAfAsAfA
因为其可以匹配a没有出现的地方,所以在每个字符前面和后面都会插A,相当于将两个字符中间的空位也当做一次匹配,对于有a出现的地方再换成A
正则表达式是最大限度匹配,会匹配所有能够匹配的字符串中长度最长的串
Select REGEXP_REPLACE('aa bb cc','.*', 'A') FROM dual;
把*后面的空格去掉显示结果为什么是两个A不是一个A
因为其首先将匹配没有任何字符的情况加一个A,再对能匹配的最大字符串即aa bb cc换成A
Select REGEXP_REPLACE('aa bb cc','.* ', 'A') FROM dual;
结果为Acc,注意表达式在.*后面有个空格
'+' 匹配前面的子表达式一次或多次。
'( )' 标记一个子表达式的开始和结束位置。
正则表达式中括号的三种功能:
1)限定多选结构的范围;如:ab(c|d|e)fgh,注意上述写法与去掉括号时abc|d|efgh 的区别
2)标注量词作用的元素;如:ab(cde)+fgh,注意上述写法与去掉括号时abcde+fhg的区别
3)为引用捕获文本;作为这个用法加括号是为了返回或引用匹配结果
'[]' 标记一个中括号表达式。
可以用来指定可以取的字符范围,如[a-z],或者排除掉[]中的内容