Oracle Database 10g 的一个新特性大大提高了您搜索和处理字符数据的能力。这个特性就是正则表达式,是一种用来描述文本模式的表示方法
 
Oracle Databasse 10g中使用正则表达式:
可使用REGEXP_LIKE 操作符和 REGEXP_INSTR、REGEXP_SUBSTR 以及 REGEXP_REPLACE 函数来发挥正规表达式的作用.
他们分别对SQL中原有LIKE操作符和INSTR、SUBSTR 和 REPLACE 函数进行了补充,增强了他们的功能。
传统SQL中的LIKE操作符和INSTR、SUBSTR 和 REPLACE 函数中:
LIKE模糊匹配:使用(%)表示任意字符出现零次、一次或多次。
使用(_)表示任意单个字符。
Ø 点号 (.) 匹配一个正则表达式中的任意字符(除了换行符),相当于原sql中的(_)
量词和重复操作表如下:

量词
说明
*
匹配 0 次或更多次
?
匹配 0 次或 1 次
+
匹配 1 次或更多次
{m}
正好匹配 m 次
{m,}
至少匹配 m 次
{m, n}
至少匹配 m 次但不超过 n 次

例子:e*表以e开头,连续出现0次货多次e,eee或eeeeee都满足表达式
.*表示任意多个连续的任意字符,如:afadfa或jjouhn都满足要求。
值得说明的是:匹配是以空格或换行符等特殊字符为分隔符的。比如e*对于字符串’eeee eeeeee’中e*匹配为两段eeee和eeeeee。因为只有这两段是连续的
 
定位元字符方式如下:

元字符
说明
^
使表达式定位至一行的开头
$
使表达式定位至一行的末尾

例子:正则表达式 ^a.b$ 匹配字符串 aab、abb 或 axb
 
预定义的 POSIX 字符类

字符类
说明
[:alpha:]
字母字符
[:lower:]
小写字母字符
[:upper:]
大写字母字符
[:digit:]
数字
[:alnum:]
字母数字字符
[:space:]
空白字符(禁止打印),如回车符、换行符、竖直制表符和换页符
[:punct:]
标点字符
[:cntrl:]
控制字符(禁止打印)
[:print:]
可打印字符

例子:[[:lower:]] 匹配一个小写字母字符,而 [[:lower:]]{5} 匹配五个连续的小写字母字符。
 
 
表达式的替换匹配和分组

元字符
说明
|
替换
                分隔替换选项,通常与分组操作符 () 一起使用
( )
分组
将子表达式分组为一个替换单元、量词单元或后向引用单元
[char]
字符列表
表示一个字符列表;一个字符列表中的大多数元字符(除字符类、^ 和 - 元字符之外)被理解为文字

例子:表达式 t(a|e|i)n 允许字母 t 和 n 之间的三种可能的字符更替。匹配模式包括如 tan、ten、tin 和 Pakistan 之类的字,但不包括 teen、mountain 或 tune
字符列表:字符列表 t[aei]n跟上面的效果相同。
 
 
Ø 位置不同,意义不同:(^)字符和连字符 (-)
* 对于(^)
表示非:[^[:digit:]] 查找包含了任意非数字字符的模式,这里(^)表示非
表示开头:而 ^[[:digit:]] 查找以数字开始的匹配模式
* 对于(-)
表示范围:正则表达式 [a-m] 匹配字母 a 到字母 m 之间的任意字母
表示连接:[-afg] 中,则(-)代表连字符。
 
REGEXP_LIKE 操作符
用法:

语法
说明
REGEXP_LIKE(source_string, pattern
[, match_parameter])
source_string 支持字符数据类型(CHAR、VARCHAR2、CLOB、NCHAR、NVARCHAR2 和 NCLOB,但不包括 LONG)。pattern 参数是正则表达式的另一个名称。match_parameter 允许可选的参数(如处理换行符、保留多行格式化以及提供对区分大小写的控制)。

 
例子:
Zip表为:

ZIP
ab123
123xy
007ab
abcxy

 
SELECT zip FROM zipcode WHERE REGEXP_LIKE(zip, '[^[:digit:]]')
这句表示含有非数字的行。所以这句执行结果是上面的记录都符合。
 
如果改成:SELECT zip FROM zipcode WHERE REGEXP_LIKE(zip, '[[:digit:]]')
其意思就是含有数字的记录行。所以行执行的结果是只有前三行记录符合要求,最后一条记录被筛选掉了。
例子:
ALTER TABLE students
ADD CONSTRAINT stud_ssn_ck CHECK
(REGEXP_LIKE(ssn,
'^([[:digit:]]{3}-[[:digit:]]{2}-[[:digit:]]{4}|[[:digit:]]{9})$'))
说明:如 123-45-6789 和 123456789 之类格式的社会保险号码对于这种列约束条件是可接受的值。有效的数据必须以三个数字开始,紧跟着一个连字符,再加两个数字和一个连字符,最后又是四个数字。另一种表达式只允许 9 个连续的数字。竖线符号 (|) 将各个选项分开。
用法:

语法
说明
REGEXP_INSTR(source_string, pattern
[, start_position
[, occurrence
[, return_option
[, match_parameter]]]])
该函数查找 pattern ,并返回该模式的第一个位置。您可以随意指定您想要开始搜索的 start_position,默认是1,这里序列是从1开始的,不是零序,请注意。 occurrence 参数默认为 1表示出现的次数,除非您指定您要查找接下来出现的一个模式。return_option 的默认值为 0,它返回该模式的起始位置;值为 1 则返回符合匹配条件的下一个字符的起始位置。

意义是:在指定的source_string字符串中找匹配的pattern的位置
start_position:指定从什么位置开始找起
occurrence:指定找第几次出现的位置
return_option:指定到底匹配的当前位置还是下一个位置
 
例子:
1
select REGEXP_INSTR ('MY LEDGER: Debits, Credits, and Invoices 1940', 
'[[:digit:]]') "REGEXP_INSTR" 
from DUAL; 
表示第一次出现数字的位置,这里搜索起始位置start_position默认1开始,默认第一次出现一次数字的位置。
执行结果是42,也就是数字1940中的1占该字符串的第42个位置。
2
select REGEXP_INSTR 
('MY LEDGER: Debits, Credits, and Invoices 1940', 
'[[:digit:]]',1,1,1) "REGEXP_INSTR" 
from DUAL;
因为return_option为1,所以表示第一次出现数字的下一个出现数字位置
所以结果是43
用法:

语法
说明
REGEXP_SUBSTR(source_string, pattern
[, position [, occurrence
[, match_parameter]]])
REGEXP_SUBSTR 函数返回匹配模式的子字符串。

 
 
例子:
select regexp_substr('I love oracle very much','o[[:alpha:]]{5}') from dual;
表示在'I love oracle very much'中查找以o开头且接着是五个字母的字符串
所以这里结果返回‘oracle’
用法:

元字符
说明
\digit
反斜线
紧跟着一个 1 到 9 之间的数字,反斜线匹配之前的用括号括起来的第 digit 个子表达式。
(注意:反斜线在正则表达式中有另一种意义,取决于上下文,它还可能表示 Escape 字符。

说明:
子表达式的匹配部分保存在临时缓冲区中。缓冲区从左至右进行编号,并利用 \digit 符号进行访问,其中 digit 是 1 到 9 之间的一个数字,它匹配第 digit 个子表达式,子表达式用一组圆括号来显示。
 
例子:
SELECT REGEXP_REPLACE(
'Ellen Hildi Smith',
'(.*) (.*) (.*)', '\3 \1 \2')
FROM dual     
的结果为:
Smith Ellen Hildi
例子:
SELECT REGEXP_SUBSTR(
'The final test is is the implementation',
'([[:alnum:]]+)([[:space:]]+)\1') AS substr
FROM dual
sql的意思为:匹配一个包由数字或字母或数字字母组成的单词,紧接着是空格,紧接着是它本身(刚出现的那个单词)
这里+号不能少,
结果为:[[:alnum:]]表示一个数字字母字符,只有添上+号,才能匹配一个单词。
SUBSTR
------
is is
用法:

语法
说明
REGEXP_REPLACE(source_string, pattern
[, replace_string [, position
[,occurrence, [match_parameter]]]])
该函数用一个指定的 replace_string 来替换匹配的模式,从而允许复杂的“搜索并替换”操作。

 
意义是:从source_string字符串中找到pattern匹配的字符串,并用replace_string加以替换。
Postion表示:从什么位置开始进行查找匹配,默认是1,表示从source_string的第一个字符开始查找
Occurrence:表示出现的次数,默认是1,表示查找到第一次出现匹配的位置
例子:
假设数据库中存放的记录样式为:200-555-0223
select REGEXP_REPLACE (Phone, 
'5', '.', 
1, 2 
) "REGEXP_REPLACE" 
from ADDRESS; 
sql的意义:从phone的起始位找起,将phone记录中的第二个5用“.”好替换
结果为:
REGEXP_REPLACE 
------------------------------------------ 
213-5.5-0223 
415-.55-7530 
214-5.5-8383 
312-5.5-1166 
707-5.5-8900 
312-5.5-1414 
415-.55-6842 
415-.55-2178 
415-.55-7387 
415-.55-7512 
415-.55-6252 
617-5.5-0125 
603-5.5-2242 
202-5.5-1414 
718-5.5-1638 
214-5.5-8383 
503-.55-7491
REGEXP_LIKE函数一般作为条件判断放在where子句后面
REGEXP_REPLACE,REGEXP_INSTR, REGEXP_SUBSTR 函数一般放在select语句后面