- 浏览: 124362 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
willse:
嘿嘿,很好很强大! 有意思............
[转]用ReflectionFactory实现不调用构造参数创建对象 -
phoenix_sun:
谢谢,很完正,是我需要的例子,多谢
使用Spring的JdbcTemplate调用Oracle的存储过程 -
fly533:
不错,非常完整!
使用Spring的JdbcTemplate调用Oracle的存储过程 -
lxc914_java:
,不错,很详细。
[转]详解JAVA POI导出EXCEL报表的操作(包括各种格式及样式的实现)
Oracle Database 10g 的一个新特性大大提高了您搜索和处理字符数据的能力。这个特性就是正规表达式,是一种用来描述文本模式的表示方法。很久以来它已在许多编程语言和大量 UNIX 实用工具中出现过了。
Oracle 的正规表达式的实施是以各种 SQL 函数和一个 WHERE 子句操作符的形式出现的。如果您不熟悉正规表达式,那么这篇文章可以让您了解一下这种新的极其强大然而表面上有点神秘的功能。已经对正规表达式很熟悉的读者可以了解如何在 Oracle SQL 语言的环境中应用这种功能。
什么是正规表达式?
正规表达式由一个或多个字符型文字和/或元字符组成。在最简单的格式下,正规表达式仅由字符文字组成,如正规表达式 cat。它被读作字母 c,接着是字母 a 和 t,这种模式匹配 cat、location 和 catalog 之类的字符串。元字符提供算法来确定 Oracle 如何处理组成一个正规表达式的字符。当您了解了各种元字符的含义时,您将体会到正规表达式用于查找和替换特定的文本数据是非常强大的。
验证数据、识别重复关键字的出现、检测不必要的空格,或分析字符串只是正规表达式的许多应用中的一部分。您可以用它们来验证电话号码、邮政编码、电子邮件地址、社会安全号码、IP 地址、文件名和路径名等的格式。此外,您可以查找如 HTML 标记、数字、日期之类的模式,或任意文本数据中符合任意模式的任何事物,并用其它的模式来替换它们。
用 Oracle Database 10g 使用正规表达式
您可以使用最新引进的 Oracle SQL REGEXP_LIKE 操作符和 REGEXP_INSTR、REGEXP_SUBSTR 以及 REGEXP_REPLACE 函数来发挥正规表达式的作用。您将体会到这个新的功能如何对 LIKE 操作符和 INSTR、SUBSTR 和 REPLACE 函数进行了补充。实际上,它们类似于已有的操作符,但现在增加了强大的模式匹配功能。被搜索的数据可以是简单的字符串或是存储在数据库字符列中的大量文本。正规表达式让您能够以一种您以前从未想过的方式来搜索、替换和验证数据,并提供高度的灵活性。
正规表达式的基本例子
在使用这个新功能之前,您需要了解一些元字符的含义。句号 (.) 匹配一个正规表达式中的任意字符(除了换行符)。例如,正规表达式 a.b 匹配的字符串中首先包含字母 a,接着是其它任意单个字符(除了换行符),再接着是字母 b。字符串 axb、xaybx 和 abba 都与之匹配,因为在字符串中隐藏了这种模式。如果您想要精确地匹配以 a 开头和以 b 结尾的一条三个字母的字符串,则您必须对正规表达式进行定位。脱字符号 (^) 元字符指示一行的开始,而美元符号 ($) 指示一行的结尾(参见表1:附表见第4页)。因此, 正规表达式 ^a.b$ 匹配字符串 aab、abb 或 axb。将这种方式与 LIKE 操作符提供的类似的模式匹配 a_b 相比较,其中 (_) 是单字符通配符。
默认情况下,一个正规表达式中的一个单独的字符或字符列表只匹配一次。为了指示在一个正规表达式中多次出现的一个字符,您可以使用一个量词,它也被称为重复操作符。.如果您想要得到从字母 a 开始并以字母 b 结束的匹配模式,则您的正规表达式看起来像这样:^a.*b$。* 元字符重复前面的元字符 (.) 指示的匹配零次、一次或更多次。LIKE 操作符的等价的模式是 a%b,其中用百分号 (%) 来指示任意字符出现零次、一次或多次。
表 2 给出了重复操作符的完整列表。注意它包含了特殊的重复选项,它们实现了比现有的 LIKE 通配符更大的灵活性。如果您用圆括号括住一个表达式,这将有效地创建一个可以重复一定次数的子表达式。例如,正规表达式 b(an)*a 匹配 ba、bana、banana、yourbananasplit 等。
Oracle 的正规表达式实施支持 POSIX (可移植操作系统接口)字符类,参见表 3 中列出的内容。这意味着您要查找的字符类型可以非常特别。假设您要编写一条仅查找非字母字符的 LIKE 条件 — 作为结果的 WHERE 子句可能不经意就会变得非常复杂。
POSIX 字符类必须包含在一个由方括号 ([]) 指示的字符列表中。例如,正规表达式 [[:lower:]] 匹配一个小写字母字符,而 [[:lower:]]{5} 匹配五个连续的小写字母字符。
除 POSIX 字符类之外,您可以将单独的字符放在一个字符列表中。例如,正规表达式 ^ab[cd]ef$ 匹配字符串 abcef 和 abdef。必须选择 c 或 d。
除脱字符 (^) 和连字符 (-) 之外,字符列表中的大多数元字符被认为是文字。正规表达式看起来很复杂,这是因为一些元字符具有随上下文环境而定的多重含义。^ 就是这样一种元字符。如果您用它作为一个字符列表的第一个字符,它代表一个字符列表的非。因此,[^[:digit:]] 查找包含了任意非数字字符的模式,而 ^[[:digit:]] 查找以数字开始的匹配模式。连字符 (-) 指示一个范围,正规表达式 [a-m] 匹配字母 a 到字母 m 之间的任意字母。但如果它是一个字符行中的第一个字符(如在 [-afg] 中),则它就代表连字符。
之前的一个例子介绍了使用圆括号来创建一个子表达式;它们允许您通过输入更替元字符来输入可更替的选项,这些元字符由竖线 (|) 分开。
例如,正规表达式 t(a|e|i)n 允许字母 t 和 n 之间的三种可能的字符更替。匹配模式包括如 tan、ten、tin 和 Pakistan 之类的字,但不包括 teen、mountain 或 tune。作为另一种选择,正规表达式 t(a|e|i)n 也可以表示为一个字符列表 t[aei]n。表 4 汇总了这些元字符。虽然存在更多的元字符,但这个简明的概述足够用来理解这篇文章使用的正规表达式。
REGEXP_LIKE 操作符
REGEXP_LIKE 操作符向您介绍在 Oracle 数据库中使用时的正规表达式功能。表 5 列出了 REGEXP_LIKE 的语法。
下面的 SQL 查询的 WHERE 子句显示了 REGEXP_LIKE 操作符,它在 ZIP 列中搜索满足正规表达式 [^[:digit:]] 的模式。它将检索 ZIPCODE 表中的那些 ZIP 列值包含了任意非数字字符的行。
SELECT zip FROM zipcode WHERE REGEXP_LIKE(zip, '[^[:digit:]]')
ZIP
-----
ab123
123xy
007ab
abcxy
这个正规表达式的例子仅由元字符组成,更具体来讲是被冒号和方括号分隔的 POSIX 字符类 digit。第二组方括号(如 [^[:digit:]] 中所示)包括了一个字符类列表。如前文所述,需要这样做是因为您只可以将 POSIX 字符类用于构建一个字符列表。
REGEXP_INSTR 函数
这个函数返回一个模式的起始位置,因此它的功能非常类似于 INSTR 函数。新的 REGEXP_INSTR 函数的语法在表 6 中给出。这两个函数之间的主要区别是,REGEXP_INSTR 让您指定一种模式,而不是一个特定的搜索字符串;因而它提供了更多的功能。接下来的示例使用 REGEXP_INSTR 来返回字符串 Joe Smith, 10045 Berry Lane, San Joseph, CA 91234 中的五位邮政编码模式的起始位置。如果正规表达式被写为 [[:digit:]]{5},则您将得到门牌号的起始位置而不是邮政编码的,因为 10045 是第一次出现五个连续数字。因此,您必须将表达式定位到该行的末尾,正如 $ 元字符所示,该函数将显示邮政编码的起始位置,而不管门牌号的数字个数。
SELECT REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph, CA 91234',
'[[:digit:]]{5}$') AS rx_instr FROM dual
RX_INSTR
----------
45
编写更复杂的模式
让我们在前一个例子的邮政编码模式上展开,以便包含一个可选的四位数字模式。您的模式现在可能看起来像这样:[[:digit:]]{5}(-[[:digit:]]{4})?$。如果您的源字符串以 5 位邮政编码或 5 位 + 4 位邮政编码的格式结束,则您将能够显示该模式的起始位置。
SELECT REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph, CA 91234-1234',
' [[:digit:]]{5}(-[[:digit:]]{4})?$') AS starts_at FROM dual
STARTS_AT
----------
44
在这个示例中,括弧里的子表达式 (-[[:digit:]]{4}) 将按 ? 重复操作符的指示重复零次或一次。此外,企图用传统的 SQL 函数来实现相同的结果甚至对 SQL 专家也是一个挑战。为了更好地说明这个正规表达式示例的不同组成部分,表 7 包含了一个对单个文字和元字符的描述。
REGEXP_SUBSTR 函数
类似于 SUBSTR 函数的 REGEXP_SUBSTR 函数用来提取一个字符串的一部分。表 8 显示了这个新函数的语法。在下面的示例中,匹配模式 [^,]* 的字符串将被返回。该正规表达式搜索其后紧跟着空格的一个逗号;然后按 [^,]* 的指示搜索零个或更多个不是逗号的字符,最后查找另一个逗号。这种模式看起来有点像一个用逗号分隔的值字符串。
SELECT REGEXP_SUBSTR('first field, second field , third field', ', [^,]*,') FROM dual
REGEXP_SUBSTR('FIR
------------------
, second field ,
REGEXP_REPLACE 函数
让我们首先看一下传统的 REPLACE SQL 函数,它把一个字符串用另一个字符串来替换。假设您的数据在正文中有不必要的空格,您希望用单个空格来替换它们。利用 REPLACE 函数,您需要准确地列出您要替换多少个空格。然而,多余空格的数目在正文的各处可能不是相同的。下面的示例在 Joe 和 Smith 之间有三个空格。REPLACE 函数的参数指定要用一个空格来替换两个空格。在这种情况下,结果在原来的字符串的 Joe 和 Smith 之间留下了一个额外的空格。
SELECT REPLACE('Joe Smith',' ', ' ') AS replace FROM dual
REPLACE
---------
Joe Smith
REGEXP_REPLACE 函数把替换功能向前推进了一步,其语法在表 9 中列出。以下查询用单个空格替换了任意两个或更多的空格。( ) 子表达式包含了单个空格,它可以按 {2,} 的指示重复两次或更多次。
SELECT REGEXP_REPLACE('Joe Smith', '( ){2,}', ' ') AS RX_REPLACE FROM dual
RX_REPLACE
----------
Joe Smith
后向引用 正则表达式的一个有用的特性是能够存储子表达式供以后重用;这也被称为后向引用(在表 10 中对其进行了概述)。它允许复杂的替换功能,如在新的位置上交换模式或显示重复出现的单词或字母。子表达式的匹配部分保存在临时缓冲区中。缓冲区从左至右进行编号,并利用 \digit 符号进行访问,其中 digit 是 1 到 9 之间的一个数字,它匹配第 digit 个子表达式,子表达式用一组圆括号来显示。
接下来的例子显示了通过按编号引用各个子表达式将姓名 Ellen Hildi Smith 转变为 Smith, Ellen Hildi。
SELECT REGEXP_REPLACE(
'Ellen Hildi Smith',
'(.*) (.*) (.*)', '\3, \1 \2')
FROM dual
REGEXP_REPLACE('EL
------------------
Smith, Ellen Hildi
该 SQL 语句显示了用圆括号括住的三个单独的子表达式。每一个单独的子表达式包含一个匹配元字符 (.),并紧跟着 * 元字符,表示任何字符(除换行符之外)都必须匹配零次或更多次。空格将各个子表达式分开,空格也必须匹配。圆括号创建获取值的子表达式,并且可以用 \digit 来引用。第一个子表达式被赋值为 \1 ,第二个 \2,以此类推。这些后向引用被用在这个函数的最后一个参数 (\3, \1 \2) 中,这个函数有效地返回了替换子字符串,并按期望的格式来排列它们(包括逗号和空格)。表 11 详细说明了该正则表达式的各个组成部分。
后向引用对替换、格式化和代替值非常有用,并且您可以用它们来查找相邻出现的值。接下来的例子显示了使用 REGEP_SUBSTR 函数来查找任意被空格隔开的重复出现的字母数字值。显示的结果给出了识别重复出现的单词 is 的子字符串。
SELECT REGEXP_SUBSTR(
'The final test is is the implementation',
'([[:alnum:]]+)([[:space:]]+)\1') AS substr
FROM dual
SUBSTR
------
is is
匹配参数选项
您可能已经注意到了正则表达式操作符和函数包含一个可选的匹配参数。这个参数控制是否区分大小写、换行符的匹配和保留多行输入。
正则表达式的实际应用
您不仅可以在队列中使用正则表达式,还可以在使用 SQL 操作符或函数的任何地方(比如说在 PL/SQL 语言中)使用正则表达式。您可以编写利用正则表达式功能的触发器,以验证、生成或提取值。
接下来的例子演示了您如何能够在一次列检查约束条件中应用 REGEXP_LIKE 操作符来进行数据验证。它在插入或更新时检验正确的社会保险号码格式。如 123-45-6789 和 123456789 之类格式的社会保险号码对于这种列约束条件是可接受的值。有效的数据必须以三个数字开始,紧跟着一个连字符,再加两个数字和一个连字符,最后又是四个数字。另一种表达式只允许 9 个连续的数字。竖线符号 (|) 将各个选项分开。
ALTER TABLE students
ADD CONSTRAINT stud_ssn_ck CHECK
(REGEXP_LIKE(ssn,
'^([[:digit:]]{3}-[[:digit:]]{2}-[[:digit:]]{4}|[[:digit:]]{9})$'))
由 ^ 和 $ 指示的开头或结尾的字符都是不可接受的。确保您的正则表达式没有分成多行或包含任何不必要的空格,除非您希望格式如此并相应地进行匹配。表 12 说明了该正则表达式示例的各个组成部分。
将正则表达式与现有的功能进行比较
正则表达式有几个优点优于常见的 LIKE 操作符和 INSTR、SUBSTR 及 REPLACE 函数的。这些传统的 SQL 函数不便于进行模式匹配。只有 LIKE 操作符通过使用 % 和 _ 字符匹配,但 LIKE 不支持表达式的重复、复杂的更替、字符范围、字符列表和 POSIX 字符类等等。此外,新的正则表达式函数允许检测重复出现的单词和模式交换。这里的例子为您提供了正则表达式领域的一个概览,以及您如何能够在您的应用程序中使用它们。
实实在在地丰富您的工具包
因为正则表达式有助于解决复杂的问题,所以它们是非常强大的。正则表达式的一些功能难于用传统的 SQL 函数来仿效。当您了解了这种稍显神秘的语言的基础构建程序块时,正则表达式将成为您的工具包的不可缺少的一部分(不仅在 SQL 环境下也在其它的编程语言环境下)。为了使您的各个模式正确,虽然尝试和错误有时是必须的,但正则表达式的简洁和强大是不容置疑的。
附表见下页:
表 1:定位元字符
表 2:量词或重复操作符
表 3:预定义的 POSIX 字符类
表 4:表达式的替换匹配和分组
表 5:REGEXP_LIKE 操作符
表 6:REGEXP_INSTR 函数
表 7: 5 位数字加 4 位邮政编码表达式的说明
表 8:REGEXP_SUBSTR 函数
表 9: REGEXP_REPLACE 函数
表 10:后向引用元字符
表 11:模式交换正则表达式的说明
表 12:社会保险号码正则表达式的说明
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表评论
-
【转】JDBC使用TNS连接多节点Oracle
2015-04-28 09:06 528原创作品,允许转载 ... -
[转]讲解oracle自定义聚合函数
2013-10-10 14:58 1067应用场景: 权限管理:同一功能对同一用户有多个不同 ... -
<a href="http://www.baidu.com">test
2012-09-25 10:07 0asda -
[转]oracle分区表总结
2011-08-09 10:17 755在ORACLE里如果遇到特别大的表,可以使用分区的表来改变 ... -
[转]Oracle中日期时间的操作比较和加减-入门基础
2011-04-13 14:23 976Oracle关于时间/日期的操 ... -
Oracle行转列, 列以字符串的形式进行拼接
2011-02-09 15:17 1547Oracle10g提供了个新函数wmsys.wm_concat ... -
SQL中escape的主要用途
2011-01-28 11:40 1643SQL中escape的主要用途 1.使用 ESCAP ... -
[转]oracle10G的闪回数据库及删除表
2011-01-12 17:22 1222最近终于体会了一下oracle10G的闪回数据库,这个功能 ... -
[转]ORACLE函数大全
2010-06-11 20:52 694文章分类:数据库 SQL 中的单记录函数1.ASC ... -
oracle 日期函数
2010-03-29 09:35 867trunc(sysdate,'Q') --本季度第一天 tru ... -
Oracle10G可以采用下面的方法
2010-02-25 14:31 769Oracle10G可以采用下面的方法<!--<br ... -
oracle学习笔记【转】
2010-02-07 11:53 8281、set linesize 100; 设置长度 ... -
oracle数据库分析响应时间
2009-11-05 16:00 1849--查看数据库响应状况 select * from SYS ... -
10g透明网关访问sqlserver
2009-10-22 14:03 98310g透明网关访问sqlserver 老话题了。 最近一个项目 ... -
ORACLE 备份与恢复EXP/IMP 命令参数
2009-08-20 16:53 1681EXP/IMP 命令参数 一、EXP: ... -
ORACLE中的正则表达式
2009-08-18 12:57 1165ORACLE终于在10G中提供了对正则表达式的支持,以前那些需 ... -
Oracle关于用户和表空间的一些操作
2009-07-08 10:54 1121SYS用户在CMD下以DBA身份 ...
相关推荐
在Oracle Database 10g中引入的正规表达式功能,极大地增强了数据库处理文本数据的能力。这一功能不仅提供了更灵活的搜索和处理方式,还使得数据库管理员和开发人员能够以更为精细的方式管理和操作数据。 #### 正规...
Oracle Database 作为业界领先的数据库产品之一,在其10g版本中引入了对正则表达式(Regular Expression, RE)的支持,这为数据管理和查询带来了更大的灵活性和效率。正则表达式是一种用于文本模式匹配的强大工具,...
Oracle 10g提供了强大的数据管理工具,包括SQL(结构化查询语言)用于数据查询和操作,以及PL/SQL,一种过程化的编程语言,用于编写存储过程、触发器等数据库对象。 Oracle 10g的安装和配置是学习的起点。这包括...
Oracle Database 10g是甲骨文公司发布的一款企业级数据库管理系统,它的全名是Oracle Database 10g Release 2,简称Oracle 10g。这个版本在当时以其先进的特性和强大的性能优化,赢得了广大数据库管理员(DBA)和...
《Pro ODP.NET for Oracle Database 11g》是一本专为开发人员设计的指南,主要探讨了如何使用ODP.NET(Oracle Data Provider for .NET)与Oracle Database 11g进行高效的数据交互。ODP.NET是Oracle公司提供的.NET...
书中的核心内容包括了数据库管理的各个方面,如安装和升级Oracle Database 11g数据库软件、创建和维护数据库、数据的导入导出、数据库的备份与恢复以及性能调优等。每一部分都以理论知识为基础,结合实际操作案例,...
在Oracle Database 11g中,SQL主要用于数据查询、数据插入、更新、删除以及数据库对象的创建和管理。以下是一些关键的SQL概念和命令: 1. **数据查询**:使用`SELECT`语句从数据库中检索数据。例如,`SELECT column...
Oracle 10g提供了许多工具和特性来提升系统性能,例如SQL Tuning Advisor用于分析和优化SQL语句,Database Buffer Cache和Shared Pool的管理,以及Automatic Workload Repository (AWR)报告,这些都帮助DBA识别并...
《Oracle Database 10g: Administration Workshop I》是Oracle公司为数据库管理员提供的核心培训课程之一,旨在帮助学员深入了解Oracle Database 10g的管理和维护。本课程覆盖了Oracle Database 10g的基础管理技能,...
Oracle Database 10g是Oracle公司推出的一款关系型数据库管理系统,是1990年代中期以来Oracle数据库系统的重要版本之一。本教程将深入探讨Oracle 10g的基础知识,帮助初学者理解并掌握这一强大的数据库管理系统的...
Oracle Database 10g Express Edition,本人用于学习。
* REGEXP_INSTR:用于返回输入字符串中满足正则表达式的第一个字符的位置。 * REGEXP_SUBSTR:用于返回输入字符串中满足正则表达式的子字符串。 在 Oracle 中使用正则表达式可以带来许多好处,如: * 简化字符串...
Oracle Database 10g SQL Fundamentals I 是一个深入学习Oracle数据库管理系统中SQL基础的课程,主要面向初学者和希望进一步掌握SQL语言的IT专业人士。在这个课程中,你会了解到如何使用SQL来管理和操作Oracle数据库...
《Oracle Database 10g SQL开发指南》是一本专注于Oracle 10g数据库系统中SQL语言使用的指导书籍。本指南涵盖了SQL的基础知识以及在Oracle环境中的一些高级特性。 首先,书中介绍的是关系数据库和SQL的基本概念。...
Oracle Database 11g是Oracle公司推出的一款企业级数据库管理系统,是DBA(数据库管理员)进行数据管理和系统优化的重要工具。本手册详细介绍了在Oracle Database 11g中进行数据库管理的各种技术和实践方法。 一、...
Oracle Database 11g是甲骨文公司(Oracle Corporation)推出的数据库系统的一个版本,它在2007年推出,并且持续在数据库技术和功能上做出了一些创新的改进。这份学生指南的第二卷,名为"Oracle Database 11g: New ...
Oracle Database 10g作为一款功能强大的关系型数据库管理系统,被广泛应用于企业级数据管理领域。SQL(Structured Query Language)作为与数据库交互的主要语言,在数据库管理和维护中扮演着至关重要的角色。通过本...
《Oracle Database 10g:New Features for Administrators》是一本专为数据库管理员设计的指南,详细介绍了Oracle Database 10g版本中的新特性和改进。这个系列包括四卷,涵盖了广泛的主题,旨在帮助管理员更好地...
Oracle Database 11g是Oracle公司推出的数据库管理系统,该系统具有高度的稳定性、强大的数据处理能力和可扩展性。它广泛应用于企业级应用中,为数据存储、数据管理和数据分析提供了坚实的基础。数据库管理员、开发...