[转] 正则表达式 oracle

地址:http://www.cnblogs.com/Azhu/archive/2012/04/03/2431127.html

从oracle database 10gsql 开发指南中copy的。

正则表达式:

本节介绍正则表达式及相关的Oracle数据库函数。使用这些函数可以在字符串中搜索字符模式。例如,假设有下列年份:

1965

1968

1971

1970

如果希望获得1965年和1968年之间的年份(包括1965年和1968年),就可以使用下面的正则表达式实现这种功能:

^196[5-8]$

正则表达式中包含许多元字符(metacharacter)。在上面这个例子中,^、[5-8]以及$都是元字符。^可以匹配一个字符串的开头;[5-8]可以匹配介于5~8之间的数字;$可以匹配一个字符串的结尾。因此,^196可以匹配以196开头的字符串;[5-8]$可以匹配以5、6、7或8结尾的字符串。而^196[5-8]$就可以匹配1965、1966、1967和1968,这就是想要的结果。

在下面这个例子中,假设有如下字符串,其中引用了莎士比亚的《罗密欧与朱丽叶》中的一句台词:

But, soft! What light through yonder window breaks?

如果想查找子字符串light,可以对引用的字符串应用下面的正则表达式:

l[[:alpha:]]{4}

在这个例子中,[[:alpha:]]和{4}都是元字符。[[:alpha:]]可以匹配A-Z或a-z之间的字符;{4}表示前面的匹配模式可以重复4次。当l、[[:alpha:]]和{4}一起使用时,可以匹配以 l 开头的5个字母组成的序列。因此,当对这个字符串应用正则表达式 l[[:alpha:]]{4}时,就可以匹配子字符串light。

表4-7列出了在正则表达式中可以使用的部分元字符,同时还给出了这些元字符的意思以及使用这些元字符的简单例子。

表4-7  正则表达式中的元字符


元  字  符


意    思


例    子


\


说明要匹配的字符是一个特殊字符、常量或者反向引用。(反向引用重复上一次匹配。)


\n 匹配换行符

\\ 匹配 \

\( 匹配(

\) 匹配)


^


匹配字符串的开头位置


如果A是字符串中的第一个字符,^A 匹配A


$


匹配字符串的末尾位置


如果B是字符串中的最后一个字符,$B匹配B


*


匹配前面的字符0次或多次。


ba*rk 可以匹配 brk、bark、baark等等


+


匹配前面的字符1次或多次。


ba+rk 可以匹配bark、baark等等,但是不能匹配brk


?


匹配前面的字符0次或1次


ba?rk 只能匹配brk和bark


{n}


匹配一个字符恰好n次,其中n是一个整数


hob{2}it 可以匹配hobbit

(续表)


元  字  符


意    思


例    子


{n,m}


匹配一个字符至少n次,最多m次,其中n和m都是整数


hob{2,3}it 只能匹配hobbit和hobbbit


.


匹配除null之外的任意单个字符


hob.it 可以匹配hobait、hobbit等等


(pattern)


匹配指定模式的一个子表达式。可以使用子表达式构成复杂的正则表达式。在这种子表达式中,可以访问单次的匹配,称为捕获(capture)


anatom(y|ies) 可以匹配anatomy和 anatomies


x|y


匹配x或y,其中x和y是一个或多个字符


war|peace 可以匹配 war 或 peace


[abc]


匹配中括号内的任意一个字符


[ab]bc 可以匹配 abc 和 bbc


[a-z]


匹配指定范围内的任意一个字符


[a-c]bc 可以匹配 abc、bbc和cbc


[: :]


指定一个字符类,可以匹配该类中的任何字符


[:alphanum:] 可以匹配字符0-9、A-Z和a-z

[:alpha:] 可以匹配字符A-Z和a-z

[:blank:] 可以匹配空格或tab键

[:digit:] 可以匹配数字 0-9

[:graph:] 可以匹配非空字符

[:lower:] 可以匹配小写字母a-z

[:print:] 与 [:graph:] 类似,不同之处在于[:print:] 包括空格字符

[:punct:] 可以匹配标点符号.,‘‘‘等等

[:space:] 可以匹配所有的空白字符

[:upper:] 可以匹配所有的大写字母A~Z

[:xdigit:] 可以匹配十六进制数字 0~9、A~F和a~f


[..]


匹配一个组合元素,例如多字符元素



[==]


指定等价类



\n


这是对前一次捕获的一个反向引用,其中n是一个正整数


(.)\1 可以匹配两个连续相同的字符。(.)可以匹配除null之外的任何单个字符,而 \1 则重复上次匹配的内容,即再次匹配相同的字符,因此可以匹配两个连续相同的字符

       

Oracle Database10gRelease 2新增加了很多类似于Perl的元字符,如表4-8所示。

表4-8  类似于Perl的元字符


元  字  符


含    义


\d


数字字符


\D


非数字字符


\w


字母字符


\W


非字母字符


\s


空白字符


\S


非空白字符

(续表)


元  字  符


含    义


\A


只匹配字符串的开头位置


\Z


只匹配字符串的末尾位置或者字符串末尾的换行符之前的位置


*?


匹配前面的模式元素0次或多次


+?


匹配前面的模式元素1次或多次


??


匹配前面的模式元素0次或1次


{n}


匹配前面的模式元素恰好n次


{n,}


匹配前面的模式元素至少n次


{n,m}


匹配前面的模式元素至少n次,但不超过m次

表4-9列出了正则表达式函数。正则表达式函数是在Oracle Database10g中新增加的, Oracle Database11g中又增加了一些条目,如下表所示。

表4-9  正则表达式函数


函    数


说    明


REGEXP_LIKE( x, pattern

[, match_option])


从x中搜索pattern参数中定义的正则表达式。可以使用match_option修改默认匹配选项,该参数可以被设置为:

•  ‘c‘,说明在匹配时区分大小写(默认选项)

•  ‘I‘,说明在匹配时不区分大小写

•  ‘n‘,允许使用可以匹配任意字符的操作符

•  ‘m‘,将x作为一个包含多行的字符串


REGEXP_INSTR( x, pattern

[, start

[, occurrence

[, return_option

[, match_option

[, subexp_option]]]])


在x中查找pattern,并返回pattern所在的位置。可以指定以下的可选参数:

•  start 开始查找的位置。默认值是1,指x的第一个字符。

•  occurrence 说明应该返回第几次出现pattern的位置。默认值是1,这意味着函数返回pattern第一次在x中出现的位置。

•  return_option 说明应该返回什么整数。若该参数为0,则说明要返回的整数是x中的第一个字符的位置;若该参数为非0的整数,则说明要返回的整数为x中出现在pattern之后的字符的位置

• match_option 修改默认的匹配设置,其工作方式与REGEXP_LIKEK()中指定的方式相同。

•  subexp_option是Oracle Database 11g新增加的,其工作方式如下:对于具有子表达式的模式,subexp_option是0~9之间的一个非负数,指出pattern中的哪个子表达式是函数的目标。例如,考虑表达式0123(((abc)(de)f)ghi)45(678),此表达式有5个子表达式,分别是:"abcdefghi"、"abcdef"、"abc"、"de"和"678"。
如果subexp_option是0,则返回pattern的位置。如果pattern没有正确的子表达式数字,则函数返回0。subexp_option为空值则返回空。subexp_option的默认值是0

(续表)


函    数


说    明


REGEXP_REPLACE(x, pattern

[, replace_string

[, start

[, occurrence

[, match_option]]]])


在x中查找pattern,并将其替换为replace_string。其他选项的意思与 REGEXP_INSTR()函数的参数完全相同


REGEXP_SUBSTR( x, pattern

[, start

[, occurrence

[, match_option

[, subexp_option]]]])


返回x中可以匹配pattern的一个子字符串,其开始位置由start指定。其他选项的意思与 REGEXP_INSTR()函数的参数完全相同。Oracle Database11g新增加的subexp_option其工作方式与REGEXP_INSTR()函数中相同


REGEXP_COUNT( x, pattern

[, start

[, match_option]])


这是Oracle Database11g新增加的一个函数。在x中查找pattern,并返回pattern在x中出现的次数。可以提供以下两个可选参数:

•  start 开始查找的位置。默认值是1,指x的第一个字符。

•  match_option 修改默认的匹配设置,其工作方式与REGEXP_LIKEK()中相同

接下来的几节将会介绍更多有关正则表达式函数的知识。

1. REGEXP_LIKE()

REGEXP_LIKE(x, pattern [, match_option])用于在x中查找pattern参数中定义的正则表达式,该函数还可以提供一个可选参数match_option,它可以设置为下面几个字符之一:

  • ‘c‘,说明在匹配时区分大小写(默认选项)
  • ‘I‘,说明在匹配时不区分大小写
  • ‘n‘,允许使用可以匹配任意字符的操作符
  • ‘m‘,将x 作为一个包含多行的字符串

下面这个查询使用REGEXP_LIKE函数检索生日在1965年到1968年之间的顾客:

SELECT customer_id, first_name, last_name, dob

FROM customers

WHERE REGEXP_LIKE(TO_CHAR(dob, ‘YYYY‘), ‘^196[5-8]$‘);

CUSTOMER_ID FIRST_NAME LAST_NAME    DOB

----------- ---------- ---------- ---------

1 John               Brown        01-JAN-65

2 Cynthia            Green        05-FEB-68

下面这个查询检索名字以J或j开头的顾客。注意传递给REGEXP_LIKE()的正则表达式是 ^j,匹配选项是i,这说明不区分大小写,因此在本例中,^j 可以匹配J或j:

SELECT customer_id, first_name, last_name, dob

FROM customers

WHERE REGEXP_LIKE(first_name, ‘^j‘, ‘i‘);

CUSTOMER_ID FIRST_NAME LAST_NAME    DOB

----------- ---------- ---------- ---------

1 John               Brown        01-JAN-65

2. REGEXP_INSTR()

REGEXP_INSTR(x, pattern [, start [, occurrence [, return_option [, match_option]]]])用于在x中查找pattern;REGEXP_INSTR()返回pattern出现的位置。匹配位置从1开始。

下面这个查询使用REGEXP_INSTR函数返回匹配正则表达式 l[[:alpha:]]{4}的位置:

SELECT

REGEXP_INSTR(‘But, soft! What light through yonder window breaks?‘,

‘l[[:alpha:]]{4}‘) AS result

FROM dual;

RESULT

----------

17

注意返回值为17,这是light中l的位置。

下面这个查询返回第二次匹配正则表达式 s[[:alpha:]]{3}的位置,匹配位置从1开始:

SELECT

REGEXP_INSTR(‘But, soft! What light through yonder window softly breaks?‘,

‘s[[:alpha:]]{3}‘, 1, 2) AS result

FROM dual;

RESULT

----------

45

下面这个查询使用REGEXP_INSTR函数返回第二次匹配字母 o 的位置,匹配位置从10开始:

SELECT

REGEXP_INSTR(‘But, soft! What light through yonder window breaks?‘,

‘o‘, 10, 2) AS result

FROM dual;

 

RESULT

----------

32

3. REGEXP_REPLACE()

REGEXP_REPLACE(x, pattern [, replace_string [, start [, occurrence[, match_option]]]])用于在x中查找pattern,并将其替换为 replace_string。

下面这个查询使用REGEXP_REPLACE函数将匹配正则表达式 l[[:alpha:]]{4}的子字符串替换为字符串 sound:

SELECT

REGEXP_REPLACE(‘But, soft! What light through yonder window breaks?‘,

‘l[[:alpha:]]{4}‘, ‘sound‘) AS result

FROM dual;

RESULT

---------------------------------------------------

But, soft! What sound through yonder window breaks?

注意light已经被替换为sound。

4. REGEXP_SUBSTR()

REGEXP_SUBSTR(x, pattern[, start [, occurrence[, match_option]]])用于在x中查找匹配pattern的子字符串,开始位置由 start指定。

下面这个查询使用REGEXP_SUBSTR函数返回匹配正则表达式 l[[:alpha:]]{4}的子字符串:

SELECT

REGEXP_SUBSTR(‘But, soft! What light through yonder window breaks?‘,

‘l[[:alpha:]]{4}‘) AS result

FROM dual;

 

RESUL

-----

light

5. REGEXP_COUNT()

REGEXP_COUNT()是Oracle Database11g新增加的一个函数。REGEXP_COUNT(x, pattern[, start [,match_option]])用于在x中查找pattern,并返回pattern在x中出现的次数。可以提供可选参数start,指出要从x中开始查找pattern的那个字符;也可以提供可选的match_option字符串,指出匹配选项。

下面这个查询使用REGEXP_COUNT函数返回正则表达式s[[:alpha:]]{3}出现的次数:

SELECT

 REGEXP_COUNT(‘But, soft! What light through yonder window softly breaks?‘,

  ‘s[[:alpha:]]{3}‘) AS result

FROM dual;

RESULT

----------

2

注意返回结果是2,这表明正则表达式在提供的字符串中有两次匹配。

时间: 2024-07-28 18:25:48

[转] 正则表达式 oracle的相关文章

Oracle正则表达式-初级使用

oracle正则表达式 ORACLE中的支持正则表达式的函数主要有下面四个: 1,REGEXP_LIKE :与LIKE的功能相似 2,REGEXP_INSTR :与INSTR的功能相似 3,REGEXP_SUBSTR :与SUBSTR的功能相似 4,REGEXP_REPLACE :与REPLACE的功能相似 它们在用法上与Oracle SQL 函数LIKE.INSTR.SUBSTR 和REPLACE 用法相同, 但是它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符. POS

Oracle正则表达式-初级

==================Oracle 正则表达式使用===============================================oracle正则表达式 ORACLE中的支持正则表达式的函数主要有下面四个: 1,REGEXP_LIKE :与LIKE的功能相似 2,REGEXP_INSTR :与INSTR的功能相似 3,REGEXP_SUBSTR :与SUBSTR的功能相似 4,REGEXP_REPLACE :与REPLACE的功能相似 它们在用法上与Oracle SQ

Oracle中的字符串类型及相关函数详解

1.概述 本文介绍String类型及相关的函数,基于当前最新的Oracle 12c 为基础作介绍. 下文将字符串简称为串. Oracle函数的工作方式有两种: 1.根据旧的对象创建新的对象--他们对原来的信息进行修改,如改变字母的大小写. 2.告诉用户有关的信息,如一个单词或句子中有几个字符. 后续会更新另外两种处理文本的方式:Oracle中的正则表达式 和 Oracle Text工具,等文章编辑完成,会在此处添加链接. Oracle中主要有两种字符串类型:CHAR和VARCHAR2,他们以字母

(Les19 Regular expression support)[20180106]

学习目标 -正则元字符串 -SQL语句中使用正则搜索 -SQL语句中使用正则匹配 -SQL语句中使用正则替代字符串 正则表达式 Oracle数据库10g引入对正则表达式的支持. 实现了符合UNIX可移植操作系统(POSIX)标准,由电气和电子工程师协会(IEEE)控制,ASCII数据匹配的语义和语法. 正则表达式是一种描述简单和复杂的搜索和操作模式的方法. 正则(POSIX )元字符 '*' 匹配前面的表达式一次或多次 '|' 指明两项之间选择其一 '^' 匹配输入字符串的开始位置,注意,若是在

Oracle中REGEXP_SUBSTR及其它支持正则表达式的内置函数小结

Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下:在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20','23'的集合. REGEXP_SUBSTR函数格式如下:function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr :需要进行正则处理的字符串__pattern :进行匹配的正则表达式,匹配的值将返回,返回策略由__occurrence决定__po

oracle正则表达式

需求: 匹配手机号,第一位可以是+,可以没有+,后面的全部要是数字,如: +861359415665 8613659558555 1356856455 都是合法的. +aa156945555 aa1359556666 aaddssdfdfsd 都是不合法的. 正则: [sql] view plaincopyprint? SQL> SELECT * FROM DUAL WHERE regexp_like('+333333' ,'^[\+]*[[:digit:]]+');      --该+转义或者

backreference Oracle正则表达式中的反向引用

这是Oracle对正则表达式的backreference的描述 从定义中可以看到,当匹配表达式中已()的形式将一个子串包含起来,后面就可以以\?的形式来引用.\1对应第一个(),\2对应第二个... 反向引用的引入使得正则表达式的匹配功能变得更加强大,介绍两个在oracle正则函数中的应用 regexp_like regexp_like('1211233','^([0-9])(\d)\1\1\2(\d)\3$') 上面这个例子中,匹配表达式里,\1表示第一个([0-9]),这个表达式要判断字符串

Oracle 正则表达式

转载:http://www.cnblogs.com/gkl0818/archive/2009/02/12/1389521.html 就是由普通字符(例如字符a到z)以及特殊字符(称为元字符)组成的文字模式.该模式描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配. 本文详细地列出了能在正则表达式中使用,以匹配文本的各种字符.当你需要解释一个现有的正则表达式时,可以作为一个快捷的参考.更多详细内容,请参考:Francois Liger,Cr

2015.3.20 Oracle使用正则表达式

.Oracle正则表达式使用介绍 正则表达式具有强大.便捷.高效的文本处理功能.能够添加.删除.分析.叠加.插入和修整各种类型的文本和数据.Oracle从10g开始支持正则表达式 ..下面通过一些例子来说明使用正则表达式来处理一些工作中常见的问题. 字符簇 字符含义 Oracle正则表达式(regularexpression) 元字符 字符含义 特殊字符: '^' 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合. '$' 匹配输入字符串的结尾位置.如果设置了 RegE