Oracle
g Release
为了与文本字符串中的模式相匹配
添加了对POSIX正则表达式的支持
Release
用一些附加的可以在Perl找到的元字符
扩充了最初的模式元字符目录
如果你正在用Oracle
gR
开发脚本
那么就看看本文里这些搜索文本的有效捷径
首先简短概述一下:函数REGEXP_LIKE针对一种模式搜索一个字符列返回一个TRUE或FALSE的逻辑值你可以在SQL SELECT语句的WHERE子句中用它来限定行数或者在PL/SQL块中检查数据的有效性相似的函数——REGEXP_REPLACEREGEXP_SUBSTR和REGEXP_INSTR——都能够在执行其他常见的字符串操作时接受POSIX正则表达式
Perl为POSIX类表达式添加了一些简短的模式例如在标准的POSIX正则表达式中你用符号[[:digit:]]来表示一个从到的阿拉伯数字在Perl中它被简化成\d大括号表示一次重复计数因此\d{}规定了三个阿拉伯数字要表示你想要一个除阿拉伯数字之外的字符POSIX模式是[^[:digit:]]但是在Perl中它只表示为\D
类似的捷径对于空白也存在:\s与[[:space:]]相对应非空白:\S对应[^[:space:]]列表A中显示了一个取自人力资源方案的例子 列表A
SQL> SELECT last_nameFROM employeesWHERE REGEXP_LIKE(last_name [[:space:]]);
LAST_NAME
De Haan
SQL> SELECT last_nameFROM employeesWHERE REGEXP_LIKE (last_name \s);
LAST_NAME
De Haan
SQL> SELECT last_nameFROM employeesWHERE REGEXP_LIKE (last_name \S)AND ROWNUM < ;
LAST_NAME
AbelAnde
Atkinson
Austin
BaerBaida
Banda
Bates
Bell
Bernstein
rows selected
Perl通过对运算符添加(?)用非贪婪型匹配运算符扩充了POSIX中的贪婪型匹配运算符例如符号^{}与至少两个最多五个开头的值相匹配但是解释是贪婪的它尽可能地与最长的字符串相匹配如果列中包括了这种符号将与前五个匹配但是符号^{}?是非贪婪的它与最短的字符串匹配这样就只有两个了列表B中是一个利用REGEXP_SUBSTR的例子
列表B
SQL> CREATE TABLE testtab (x VARCHAR());
Table created
SQL> BEGIN
FOR i IN LOOP
INSERT INTO testtab VALUES (LPAD(i));
END LOOP;
END;
/
PL/SQL procedure successfully completed
SQL> SELECT x FROM testtab;
X
rows selected
SQL> SELECT REGEXP_SUBSTR(x ^{})
FROM testtab;
REGEXP_SUB
rows selected
SQL> SELECT REGEXP_SUBSTR(x ^{}?)
FROM testtab;
REGEXP_SUB
rows selected