`
logicgate
  • 浏览: 98363 次
  • 性别: Icon_minigender_1
  • 来自: 新力吐皮
社区版块
存档分类
最新评论

Oracle 学习笔记: 正则表达式

阅读更多

Oracle 10g数据库内建了符合IEEE POSIX (Portable Operating System for Unix)标准的正则表达式。熟练使用正则表达式,可以写出简洁,强大的SQL语句。

 

正则表达式有几个优点优于常见的LIKE操作符和INSTR、SUBSTR及REPLACE 函数的。这些传统的SQL 函数不便于进行模式匹配。只有LIKE 操作符通过使用%和_字符匹配,但LIKE不支持表达式的重复、复杂的更替、字符范围、字符列表和POSIX 字符类等等。

 

元字符(Meta Character):

^            使表达式定位至一行的开头
$            使表达式定位至一行的末尾
*            匹配 0 次或更多次
?            匹配 0 次或 1 次
+            匹配 1 次或更多次
{m}          正好匹配 m 次
{m,}         至少匹配 m 次
{m, n}       至少匹配 m 次但不超过 n 次
[:alpha:]    字母字符
[:lower:]    小写字母字符
[:upper:]    大写字母字符
[:digit:]    数字
[:alnum:]    字母数字字符
[:space:]    空白字符(禁止打印),如回车符、换行符、竖直制表符和换页符[:punct:]    标点字符
[:cntrl:]    控制字符(禁止打印)
[:print:]    可打印字符 | 分隔替换选项,通常与分组操作符 () 一起使用
( )          将子表达式分组为一个替换单元、量词单元或后向引用单元
[char]       字符列表

 

Oracle 10g提供了四个regexp function: REGEXP_LIKE , REGEXP_REPLACE , REGEXP_INSTR , REGEXP_SUBSTR

REGEXP_LIKE:比较一个字符串是否与正则表达式匹配
(srcstr, pattern [, match_option])

REGEXP_INSTR:在字符串中查找正则表达式,并且返回匹配的位置
(srcstr, pattern [, position [, occurrence [, return_option [, match_option]]]])

REGEXP_SUBSTR:返回与正则表达式匹配的子字符串
(srcstr, pattern [, position [, occurrence [, match_option]]]) 

REGEXP_REPLACE:搜索并且替换匹配的正则表达式
(srcstr, pattern [, replacestr [, position [, occurrence [, match_option]]]])
 

其中各参数的含义为:

srcstr:        被查找的字符数据。 
pattern:       正则表达式。
occurrence:    出现的次数。默认为1。
position:      开始位置
return_option: 默认值为0,返回该模式的起始位置;值为1则返回符合匹配条件的下一个字符的起始位置。
replacestr:    用来替换匹配模式的字符串。
match_option:  匹配方式选项。缺省为c。
               c:case sensitive
               I:case insensitive
               n:(.)匹配任何字符(包括newline)
               m:字符串存在换行的时候被作为多行处理
 

下面通过一些具体的例子来说明如何使用这四个函数。首先创建一个测试数据表,

SQL> create table person (
  2  first_name varchar(20),
  3  last_name varchar(20),
  4  email varchar(100),
  5  zip varchar(6));

Table created.

SQL> insert into person values ('Steven', 'Chen', 'steven@hp.com', '123456');
1 row created.

SQL> insert into person values ('James', 'Li', 'jamesli@sun.com' || chr(10) || 'lijames@oracle.com', '1b3d5f');
1 row created.

SQL> commit;
Commit complete.

SQL> select * from person;

FIRST_NAME LAST_NAME  EMAIL                ZIP
---------- ---------- -------------------- ------
Steven     Chen       steven@hp.com        123456
James      Li         jamesli@sun.com      1b3d5f
                      lijames@oracle.com

 

1。REGEXP_LIKE

SQL> select zip as invalid_zip from person where regexp_like(zip, '[^[:digit:]]');
INVALID_ZIP
--------------------
1b3d5f

SQL> select first_name from person where regexp_like(first_name, '^S.*n$');
FIRST_NAME
----------
Steven

SQL> select first_name from person where regexp_like(first_name, '^s.*n$');
no rows selected

SQL> select first_name from person where regexp_like(first_name, '^s.*n$', 'c');
no rows selected

SQL> select first_name from person where regexp_like(first_name, '^s.*n$', 'i');
FIRST_NAME
----------
Steven

SQL> select email from person where regexp_like(email, '^james.*com$');
no rows selected

SQL> select email from person where regexp_like(email, '^james.*com$', 'n');
EMAIL
--------------------
jamesli@sun.com
lijames@oracle.com

SQL> select email from person where regexp_like(email, '^li.*com$');
no rows selected

SQL> select email from person where regexp_like(email, '^li.*com$', 'm');
EMAIL
--------------------
jamesli@sun.com
lijames@oracle.com

 

注意上面分别测试了不同的match_option对结果的影响。

 

2。REGEXP_INSTR

查找zip中第一个非数字字符的位置
SQL> select regexp_instr(zip, '[^[:digit:]]') as position from person;
  POSITION
----------
         0
         2

从第三个字符开始,查找zip中第二个非数字字符的位置
SQL> select regexp_instr(zip, '[^[:digit:]]', 3, 2) as position from person;
  POSITION
----------
         0
         6

从第三个字符开始,查找zip中第二个非数字字符的下一个字符位置
SQL> select regexp_instr(zip, '[^[:digit:]]', 3, 2, 1) as position from person;
  POSITION
----------
         0
         7

 

3。REGEXP_SUBSTR

SQL> select regexp_substr(zip, '[^[:digit:]]') as zip from person;
ZIP
------------------
b

SQL> select regexp_substr(zip, '[^[:digit:]]', 3, 2) as zip from person;
ZIP
------------
f
 

4。REGEXP_REPLACE

把zip中所有非数字字符替换为0
SQL> update person set zip=regexp_replace(zip, '[^[:digit:]]', '0')
  2  where regexp_like(zip, '[^[:digit:]]');
1 row updated.

SQL> select zip from person;
ZIP
------
123456
103050
 

后向引用(backreference):

 

后向引用是 一个很有用的特性。它能够把子表达式的匹配部分保存在临时缓冲区中,供以后重用 。缓冲区从左至右进行编号,并利用 \digit 符号进行访问。子表达式用一组圆括号来显示。利用后向引用可以实现较复杂的替换功能。

SQL> select regexp_replace('Steven Chen', '(.*) (.*)', '\2, \1') as reversed_name from dual;

REVERSED_NAME
--------------------
Chen, Steven
 

在DDL中也可以正则表达式,比如Constraint, index, view

SQL> alter table person add constraint constraint_zip check (regexp_like(zip, '^[[:digit:]]+$'));

SQL> create index person_idx on person(regexp_substr(last_name, '^[[:upper:]]'));
分享到:
评论

相关推荐

    暑假培训学习笔记之 java正则表达式

    Java正则表达式是编程语言Java中的一个强大工具,用于处理字符串模式匹配和搜索替换操作。...对于“暑假培训学习笔记之 java正则表达式”这个主题,深入学习这些知识点将有助于提升你在Java编程中的文本处理能力。

    HTML笔记. J2EE笔记. Javascript笔记. JAVA笔记.oracle 笔记.Linux笔记.tomcat笔记.面试问题.数据结构.听韩顺平的笔记.正则表达式.

    HTML笔记. J2EE笔记. Javascript笔记. JAVA笔记.oracle 笔记.Linux笔记.tomcat笔记.面试问题.数据结构.听韩顺平的笔记.正则表达式.等,我是我在上大学时学习做的笔记,拿出来和大家共享。。

    Parch 学习笔记系列(十七本)

    这个压缩包包含十七本详细的学习笔记,旨在帮助初学者和有一定经验的开发者深入理解这些关键的技术。 1. **CXF学习笔记**:CXF是一个开源的Java框架,用于构建和开发服务导向架构(SOA)和RESTful应用程序。笔记会...

    编程学习笔记(数据库,C#)

    本文将主要探讨DECODE函数的用法、Oracle数据库中的SUBSTR函数以及正则表达式的语法。 1. **DECODE函数**: DECODE函数在数据库查询中常用于条件判断和返回对应结果。它允许你根据输入值与一系列预设值进行比较,...

    学习笔记.txt

    Oracle数据库通过其PL/SQL(Procedural Language for SQL)环境提供了丰富的正则表达式支持功能,`REGEXP_REPLACE`就是其中一个非常实用的功能。 #### 1. `REGEXP_REPLACE`函数简介 `REGEXP_REPLACE`函数用于在...

    详细的sql笔记

    总的来说,这份“详细的sql笔记”涵盖了数据库的基础知识,特别是Oracle数据库的使用和函数应用,以及正则表达式的实践。这些内容对于数据库管理员、开发人员或数据分析人员来说都是非常宝贵的学习资源,能够帮助...

    ORACLE学习笔记

    这篇ORACLE学习笔记涵盖了数据库管理和SQL语言的基础知识,让我们一一深入探讨。 1. 数据字典:Oracle的数据字典是一系列视图和表,存储着关于数据库对象、权限和其他元数据的信息。例如,`dba_tablespaces`用于...

    Java,web,oracle笔记

    这份文档是关于Java、Web开发和Oracle数据库的学习笔记,主要侧重于基础知识点以及学习中需要注意的事项,非常适合初学者学习和使用。文档涵盖了多个知识点,包括Java基础、Unix/Linux命令行操作、数据库操作以及Web...

    韩顺平前端学习笔记(全套)

    最后,虽然"韩顺平oracle学习笔记"不在传统的前端范畴内,但数据库知识对于开发全栈工程师来说依然重要。Oracle是企业级关系型数据库管理系统,笔记可能涵盖了SQL查询、数据库设计、事务处理、存储过程、索引、备份...

    JavaNotes:自学,存放学习笔记

    自学ing,存放学习笔记 目录 JavaSE 面向对象 Java集合 常用类 异常 枚举类 注解 泛型 泛型本质 反射 多线程 文件类和IO流 Java8新特性 JDBC JavaSE易错点 JavaAdvance 活动 RPC 分散ID API网关 杰克逊 ...

    Oracle资料.pdf

    Oracle数据库的学习笔记涵盖了从基础知识到高级概念的多个方面。这些笔记内容包括安装和配置Oracle数据库,以及如何进行数据库的维护和管理。其中提到的MySQL安装,虽然MySQL是另一种流行的数据库系统,但与Oracle...

    oracle笔记

    单行函数包括字符函数、数字函数、转换函数、日期函数和正则表达式函数。 3.1.1 字符函数 字符函数主要用于字符串的操作,例如: - ASCLL(x):返回字符的ASCII码。 - CHR(x):根据ASCII码返回对应字符。 - CONCAT(x...

    java学习笔记

    3. 正则表达式:用于模式匹配的字符串操作。 4. Date类和Calendar类:进行日期和时间的操作。 5. SimpleDateFormat类和DateFormat类:日期时间的格式化和解析。 6. 包装类和BigDecimal类:封装基本数据类型,以及...

    从实践中学习oracleSQL读书笔记

    16. **转义字符**:`\`用于转义特殊字符,`~`有时用于正则表达式。 17. **排序(ORDER BY子句)**:`ORDER BY`用于对查询结果进行排序,必须置于SQL语句最后。可以指定列名、别名、表达式或列号,多列排序需指定每...

    新051课堂笔记

    正则表达式用于模式匹配,本节将介绍如何在Oracle中使用正则表达式进行复杂的文本处理。 综上所述,以上内容覆盖了Oracle SQL语言的基础知识和高级特性,对于学习Oracle数据库管理和开发的人来说是非常宝贵的学习...

    MySQL入门很简单-学习笔记_20110913.pdf

    8. **使用正则表达式查询**:使用LIKE或REGEXP操作符。 #### 十、插入、更新与删除数据 1. **插入数据** - **为表的所有字段插入数据**:`INSERT INTO table_name VALUES (value1, value2, ...);` - **为表的...

    chm参考文档

    【Java笔记.chm】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(后被Oracle收购)开发...通过学习正则表达式,开发者可以更有效地处理字符串操作,特别是在处理大量数据的文本处理和数据分析任务中。

    Java学习笔记

    ### Java学习笔记精要 #### 一、Java技术基础概览 **1.1 编程语言** 在探讨Java之前,我们先理解编程语言的基本分类。编程语言是人与计算机交流的工具,按其功能和特性可分为三类:机器语言、汇编语言以及高级...

    oracle ocp认证考试 新047(051)课堂笔记 甲骨文

    Oracle OCP认证的考试内容广泛且深入,通过学习这些笔记,考生能够全面了解并掌握Oracle数据库的核心技术和管理实践,从而提高在实际工作中的表现。对于希望在Oracle数据库领域深化职业发展的专业人士来说,这个认证...

Global site tag (gtag.js) - Google Analytics