Oracle 和Oracle i中缺乏灵活性的SQL 正则表达式最终在Oracle g中得到了解决Oracle 数据库目前内建了符合POSIX 标准的正则表达式
四个新的函数分别是REGEXP_LIKEREGEXP_INSTRREGEXP_SUBSTR和 REGEXP_REPLACE它们在用法上与Oracle SQL 函数LIKEINSTRSUBSTR 和REPLACE 用法但是它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符
POSIX 正则表达式由标准的元字符(metacharacters)所构成
^ 表示字符串的开始
$ 表示字符串的结束
表示任何字符
字符的范围比如说[az]表示任何ASCII 小写字母与字符类[[:lower:]] 等价
? 允许一个后继字符匹配零次或一次
+ 允许一个后继字符匹配一次或多次
* 表示零次或多次
可以使用{mn} 指定一个精确地出现范围其意思是出现从m 次到n 次{m} 表示正好m次而{m} 表示至少m次还可以使用圆括号组合字符的集合使用|(竖线)表示可替换例如字符串^([az]+|[]+)$将匹配所有由小写字母或数字组合成的字符串
REGEXP_LIKE 与LIKE 操作符相似如果第一个参数匹配正则表达式它就解析为TRUE例如WHERE REGEXP_LIKE(ENAME^J[AO]i) 将在ENAME 以JA 或JO 开始的情况下返回一行数据I 参数指定正则表达式是大小写敏感的另外还可以在CHECK 约束和函数索引中指定REGEXP_LIKE例如
ALTER TABLE EMP ADD CONSTRAINT REGEX
CHECK (REGEXP_LIKE(ENAME^[[:alpha:]]+$));
这条语句使得ENAME 字段只能包含字母和数字字符(也就是说没有空格或者标点符号)试图插入或者更新这些数据将导致一个ORA 异常或者检查约束的有效性
REGEXP_INSTR 与INSTR 函数类似它返回一个字符串中匹配一个正则表达式的第一个子串的开始位置例如
SELECT REGEXP_INSTR(The total is $ for your purchase$[[:digit:]]+)
FROM DUAL;
这个查询返回即$在字符串的开始位置另外还可以指定子串出现的次数开始搜索的位置是返回匹配的位置还是返回匹配之后字符的位置
REGEXP_SUBSTR 返回匹配一个正则表达式的子串虽然结合使用SUBSTR 和REGEXP_INSTR 及LENGTH 也可以实现这一功能但是使用这个函数却更为简单
SELECT REGEXP_INSTR(onetwothree[^]*) FROM DUAL;
这个查询返回one将第一个参数看成一个逗号分隔的列表并返回第一个逗号之前的所有字符
REGEXP_REPLACE 返回初始参数被匹配子串替换之后的结果例如
SELECT REGEXP_REPLACE(The temperature is °F
([[:digit:]])+°F
()*/||°C)
FROM DUAL;
这个查询将查找一个华氏温度并将其转换为摄氏度它将返回The temperature is °C