Oracle正则表达式使用小结

oracle数据库从10g开始引入了对正则表达式的支持,正则表达式是一种描述简单和复杂的搜索和处理模式的方法,在与SQL一起使用时,正则表达式可以对Oracle数据库中存储的任何数据执行强大的搜索和处理。oracle数据库引入正则表达式以后一个明显的好处是,可以把匹配逻辑集中在数据库端,避免了在中间层中匹配处理,实现起来更加方便。

本文参照了oracle的官方文档,概要总结了一下在oracle中使用正则表达式的一些方法:

(一)正则表达式函数

(1)REGEXP_LIKE

REGEXP_LIKE可以放在查询的where语句中,查询返回满足匹配条件的结果记录。

-- first_name匹配查找:Steven、Stephen
SELECT *
  FROM employees e
 WHERE regexp_like(e.first_name,
                   '^Ste(v|ph)en$');

-- 还可以用在约束中
CREATE TABLE cux_test(l_name VARCHAR2(30),
                      p_number VARCHAR2(30),
 CONSTRAINT c_contacts_pnf CHECK(regexp_like(p_number, '^\(\d{3}\) \d{3}-\d{4}$')));

(2)REGEXP_COUNT

REGEXP_LIKE返回满足正则表达式的字符串在给定字符串中出现的次数。

-- 返回结果是:1
SELECT regexp_count('Yedward1992',
                    'd',
                    4,
                    'c')
  FROM dual;

-- 返回结果是:2
SELECT regexp_count('Yedward1992',
                    'd',
                    3,
                    'c')
  FROM dual;

函数中第3个参数表示起始位置,第4个参数c表示大小写敏感,i表示不敏感。

(3)REGEXP_INSTR

REGEXP_INSTR返回一个整数值表示正则表达式在给定字符串中第一次匹配上的起始位置。

-- 返回值是:1
SELECT regexp_instr('yedward92@qq.com',
                    '\w+@\w+(\.\w+)+')
  FROM dual;

(4)REGEXP_REPLACE

REGEXP_REPLACE用以对匹配的字符串进行替换,返回替换后的结果。

-- 返回值是:yedward yedward
SELECT regexp_replace('yedward92yedward','\d+',' ')
  FROM dual;

(5)REGEXP_SUBSTR

REGEXP_SUBSTR返回满足匹配模式的字符串。

-- 返回结果:yedward
-- x表示忽略空格
SELECT regexp_substr('y edward92yedward92',
                     'y e d w a r d',
                     1,
                     1,
                     'x')
  FROM dual;
-- 返回结果:92
SELECT regexp_substr('yedward92yedward92',
                     '\d+',
                     1)
  FROM dual;

(二)匹配选项

可以通过设置以下表格中的一些匹配选项来进行特定模式的匹配,比如:i表示匹配时忽略大小写、c表示匹配时大小写敏感。

选项描述
示例
i
指定大小写不敏感匹配
regexp_count('Albert Einstein', 'e', 1, 'i')
c
指定大小写敏感匹配
regexp_count('Albert Einstein', 'e', 1, 'c')
n
指定允许点(.)匹配换行符(char(10)),默认不匹配regexp_substr('a' || chr(10) || 'd', 'a.d', 1, 1, 'n')
m
指定多行模式,当字符串中有换行时,默认是中止的,指定多行模式以后允许多行匹配。
regexp_substr('ab' || chr(10) || 'ac', '^a.', 1, 2, 'm'),返回结果是ac,如果把m选项去掉了,则返回空
x
指定忽略空格字符,默认空格匹配不忽略。regexp_substr('abcd', 'a b c d', 1, 1, 'x')

(三)常见元字符

下面是Oracle数据库支持的一些常见的元字符,其中包括POSIX标准的、以及Perl正则表达式扩展的元字符,下面不是全部,只是常用到的一些。

元字符
说明
.
点号,匹配所支持字符集中的任何字符,null除外。默认也不匹配换行符,除非指定了模式为n。
+
加号,匹配一个或多个匹配项。
*
星号,匹配0个或多个匹配项。
?问号,匹配0个或1个匹配项。
{m}
精确匹配m次。
{m, }匹配至少m次。
{m, n}匹配至少m次,但是不超过n次。
[char...]指定匹配一个字符集合。
[^char...]
指定不匹配一个字符集合。
[alt1|alt2]
或(or)的意思,匹配其中一个。
(expr)
对表达式进行分组,视作一个子表达式。
\n
向后引用表达式。
\
转义符。
^
起始。
$结尾。
\d匹配数字字符。
\D
匹配非数字字符。
\w
匹配单词字符。
\W
匹配非单词字符。
\s
匹配空白字符。
\S
匹配非空白字符。
\A仅匹配字符串的开头。
\Z
仅匹配字符串的结尾或行结尾之前。
\z
仅匹配字符串的结尾。

本文标题:Oracle正则表达式使用小结

本文链接:http://yedward.net/?id=364

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章