[转] 正则表达式 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"。 |
(续表)
|
函 数 |
说 明 |
|
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,这表明正则表达式在提供的字符串中有两次匹配。
[转] 正则表达式 oracle的更多相关文章
- Oracle Like、Instr以及正则表达式
查看测试数据 select * from student; 1. like 在where字句中使用like可以达到模糊查询的效果,常用通配符如下 ▶ %: 使用 % 有三种情况 ① 字段 like ‘ ...
- pl/sql学习(6): 引号/程序调试/列中的字符串合并/正则表达式
有关自治事务的问题: https://www.cnblogs.com/princessd8251/p/4132649.html 我在plsql development学习中遇到的常见问题: (一) 引 ...
- oracle正则表达式的用法
<SPAN style="FONT-SIZE: 18px">Oracle 正则表达式函数-REGEXP_SUBSTR 使用例子 .5个参数 第一个是输入的字符串 第二个 ...
- Oracle 正则表达式使用示例
正则表达式的基本例子 在使用这个新功能之前,您需要了解一些元字符的含义.句号 (.) 匹配一个正规表达式中的任意字符(除了换行符).例如,正规表达式 a.b 匹配的字符串中首先包含字母 a,接着是其它 ...
- ORACLE中的支持正则表达式的函数
ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBS ...
- Oracle中的正则表达式
检查约束 --密码的长度必须在3-6 --年龄必须在1-120 --性别只能是男或女 --电话号码必须满足电话的格式: 手机格式,座机格式 drop table test; select * from ...
- oracle 10g正则表达式 REGEXP_LIKE 用法
ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBS ...
- Oracle正则表达式函数:regexp_like、regexp_substr、regexp_instr、regexp_replace
Oracle正则表达式函数:regexp_like.regexp_substr.regexp_instr.regexp_replace --去掉所有特殊字符,只剩字母 SELECT REGEXP ...
- oracle的正则表达式
阅读目录 1.oracle(regular expression)简单介绍 2.oracle正则特殊字符 3.oracle正则字符簇 4.各种操作符的运算优先级 5.模拟测试例子 6.oracle对应 ...
随机推荐
- jquery 新建的元素事件绑定问题
js的事件监听跟css不一样,css只要设定好了样式,不论是原来就有的还是新添加的,都有一样的表现.而事件监听不是,你必须给每一个元素单独绑定事件. 常见的例子是处理表格的时候.每行行末有个删除按钮, ...
- Java SSH远程执行Shell脚本实现(转)
前言 此程序需要ganymed-ssh2-build210.jar包(下载地址:http://www.ganymed.ethz.ch/ssh2/) 为了调试方便,可以将\ganymed-ssh2-bu ...
- 微软免费TFS如何设置在客户端独占签出
最近发现微软给我们提供了免费的TFS,地址:http://tfs.visualstudio.com/, 就注册了一个,但是我发现没办法独占签出. 在公司里,TFS有服务端,所以很好设置,但是注册微软的 ...
- Prepared statements(mysqli & pdo)
参考: http://php.net/manual/en/mysqli.quickstart.prepared-statements.php http://www.ultramegatech.com/ ...
- linux学习资料
鸟哥的Linux私房菜 基础学习篇(第三版) http://book.51cto.com/art/201007/211888.htm 鸟哥的Linux私房菜——服务器架设篇 http:// ...
- DM 之 全解析
一.设计模式的分类 二十三大设计模式,分为三大类: 1. 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 2. 结构型模式,共七种:适配器模式.装饰器模式.代理模式. ...
- jquery学习笔记2
1.点击时文字消失,失去焦点时文字再出现 <input type="text" value="郭强" onfocus="if(value=='郭 ...
- 经典的iptables shell脚本
PS:这个iptables脚本不错,很实用,根据实际应用改一下就可以自己用.分享出来,供大家来参考.原作者佚名.源代码如下: #!/bin/sh modprobe ipt_MASQUERADE mod ...
- 1.6.6 De-Duplication(重复数据删除)
1. 重复数据删除 solr通过<Signature>类的类型来支持重复数据删除技术的.一个Signature可以通过以下几种方式实现: 方法 描述 MD5Signature 128 ...
- 对《[Unity官方实例教程 秘密行动] Unity官方教程《秘密行动》(十二) 角色移动》的一些笔记和个人补充,解决角色在地形上移动时穿透问题。
这里素材全是网上找的. 教程看这里: [Unity官方实例教程 秘密行动] Unity官方教程<秘密行动>(九) 角色初始设定 一.模型设置: 1.首先设置模型的动作无限循环. 不设置的话 ...