REPLACE 函数是用另外一个值来替代串中的某个值。例如,可以用一个匹配数字来替代字母的每一次出现。REPLACE 的格式如下所示:

  1. REPLACE ( char, search_string [, replace_string])

如果没有指定replace_string 变量的值,那么当发现search_string 变量的值时,就将其删除。输入可以为任何字符数据类型——CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB或NCLOB。下面是一个示例:

  1. REPLACE('GEORGE', 'GE', 'EG') = EGOREG
  2. REPLACE('GEORGE', 'GE', NULL) = OR

如果搜索串的长度不为零,则可以知道搜索串在某个串中出现的次数。首先,计算源串的长度:

  1. LENGTH('GEORGE')

然后,计算源串删除搜索串以后的长度:

  1. LENGTH(REPLACE('GEORGE', 'GE', NULL))

接着用搜索串的长度除以两次的长度之差,就可以得到搜索串出现的次数:

  1. select LENGTH('GEORGE')
  2. - LENGTH(REPLACE('GEORGE', 'GE', NULL))
  3. /
  4. LENGTH('GE') AS Counter
  5. from DUAL;
  6. COUNTER
  7. -------

REGEXP_REPLACE 函数在几个方面扩展了REPLACE 函数的功能。它支持在搜索模式中使用正则表达式,也支持本章前面描述的变量,即position、occurrence 和match_parameter,从而可以选择只替代某些匹配的值,或者不区分大小写。REGEXP_REPLACE 函数的语法如下所示:

  1. REGEXP_REPLACE( source_string, pattern
  2. [, replace_string
  3. [, position
  4. [, occurrence
  5. [, match_parameter ]
  6. ]
  7. ]
  8. ]
  9. )

除了replace_string,这里所有的变量都已经在本章前面章节作了介绍。replace_string 告诉Oracle 用什么来替代source_string 中与pattern 匹配的部分。occurrence 变量是一个非负整数,它指定操作的次数:如果为0,则所有的匹配项都被替代;如果指定一个正数,则Oracle替代第n 次匹配。

考虑ADDRESS 表中的Phone 列。首先,寻找格式为###-###-#### 的号码。该格式分为3 部分,分别是3 个数字的集合、后面是另3 个数字的一个集合,然后又是4 个数字的一个集合,中间用‘-’符号隔开。通过在REGEXP_SUBSTR 函数调用中查找那些数字集合,可以找到与该标准匹配的行:

  1. select REGEXP_SUBSTR (Phone,
  2. '([[:digit:]]{3})-([[:digit:]]{3})-([[:digit:]]{4})'
  3. ) "REGEXP_SUBSTR"
  4. from ADDRESS;
  5. REGEXP_SUBST
  6. ------------
  7. 213-555-0223
  8. 415-555-7530
  9. 214-555-8383
  10. 312-555-1166
  11. 707-555-8900
  12. 312-555-1414
  13. 415-555-6842
  14. 415-555-2178
  15. 415-555-7387
  16. 415-555-7512
  17. 415-555-6252
  18. 617-555-0125
  19. 603-555-2242
  20. 202-555-1414
  21. 718-555-1638
  22. 214-555-8383
  23. 503-555-7491

现在,使用REGEXP_REPLACE 把前3 个数字放在圆括号内,同时省略第一个‘-’符号。为此,我们将第1 个数字集称为 \1,第2 个数据集称为 \2,第3 个数据集称为\3。

  1. select REGEXP_REPLACE (Phone,
  2. '([[:digit:]]{3})-([[:digit:]]{3})-([[:digit:]]{4})'
  3. , '(\1) \2-\3'
  4. ) "REGEXP_REPLACE"
  5. from ADDRESS;
  6. REGEXP_REPLACE
  7. ------------------------------------------
  8. (213) 555-0223
  9. (415) 555-7530
  10. (214) 555-8383
  11. (312) 555-1166
  12. (707) 555-8900
  13. (312) 555-1414
  14. (415) 555-6842
  15. (415) 555-2178
  16. (415) 555-7387
  17. (415) 555-7512
  18. (415) 555-6252
  19. (617) 555-0125
  20. (603) 555-2242
  21. (202) 555-1414
  22. (718) 555-1638
  23. (214) 555-8383
  24. (503) 555-7491

输出说明了REGEXP_REPLACE 函数调用的结果,即区号用圆括号括起来,第一个'-'被去掉。

为了说明occurrenc 变量的工作原理,下面的REGEXP_REPLACE 函数调用是用句点来替代电话号码中的第二个'5':

  1. select REGEXP_REPLACE (Phone,
  2. '5', '.',
  3. 1, 2
  4. ) "REGEXP_REPLACE"
  5. from ADDRESS;
  6. REGEXP_REPLACE
  7. ------------------------------------------
  8. 213-5.5-0223
  9. 415-.55-7530
  10. 214-5.5-8383
  11. 312-5.5-1166
  12. 707-5.5-8900
  13. 312-5.5-1414
  14. 415-.55-6842
  15. 415-.55-2178
  16. 415-.55-7387
  17. 415-.55-7512
  18. 415-.55-6252
  19. 617-5.5-0125
  20. 603-5.5-2242
  21. 202-5.5-1414
  22. 718-5.5-1638
  23. 214-5.5-8383
  24. 503-.55-7491

可以进一步修改该查询语句,排除前3 个可能匹配的数字(开始位置设为4),并替代第4次出现:

  1. select REGEXP_REPLACE (Phone,
  2. '5', '.',
  3. 4, 4
  4. ) "REGEXP_REPLACE"
  5. from ADDRESS;
  6. REGEXP_REPLACE
  7. ------------------------------------------
  8. 213-555-0223
  9. 415-555-7.30
  10. 214-555-8383
  11. 312-555-1166
  12. 707-555-8900
  13. 312-555-1414
  14. 415-555-6842
  15. 415-555-2178
  16. 415-555-7387
  17. 415-555-7.12
  18. 415-555-62.2
  19. 617-555-012.
  20. 603-555-2242
  21. 202-555-1414
  22. 718-555-1638
  23. 214-555-8383
  24. 503-555-7491

通过在where 子句中使用REGEXP_INSTR,可以限制返回的行。在本例中,只显示那些至少含有4 个‘5’的行(从第4 个字符开始)。因为该搜索模式并不复杂,所以这里也可以使用INSTR 函数。

  1. select REGEXP_REPLACE (Phone,
  2. '5', '.',
  3. 4, 4
  4. ) "REGEXP_REPLACE"
  5. from ADDRESS
  6. where REGEXP_INSTR(Phone, '5',4,4) > 0;
  7. 415-555-7.30
  8. 415-555-7.12
  9. 415-555-62.2
  10. 617-555-012.

可以使用该功能来搜索可供选择的值,从而在单个查询中组合使用多个查询标准。在下面的示例中,可以替代5 或者2;‘5’和‘2’的出现次数都记入occurrence 统计量中:

  1. select REGEXP_REPLACE (Phone,
  2. '(5|2)', '.',
  3. 4, 4
  4. ) "REGEXP_REPLACE"
  5. from ADDRESS
  6. where REGEXP_INSTR(Phone, '(5|2)',4,4) > 0;
  7. REGEXP_REPLACE
  8. ------------------------------------------
  9. 213-555-0.23
  10. 415-555-7.30
  11. 415-555-684.
  12. 415-555-.178
  13. 415-555-7.12
  14. 415-555-6.52
  15. 617-555-01.5
  16. 603-555-.242

由于该示例中出现的‘|’符号是一个可选的运算符,因此,匹配两个指定值中任何一个都将返回一行。关于正则表达式中支持的更多运算符,请参阅表8-1。

转载于:https://www.cnblogs.com/maowh/p/3711656.html

Oracle中的正则表达式(REPLACE 和REGEXP_REPLACE)---转载自http://database.51cto.com/art/201009/228270.htm...相关推荐

  1. 查询oracle的联机日志文件,查询Oracle日志文件的方法(摘自http://database.51cto.com/art/201010/231519.htm)...

    Oracle日志文件相信经常使用Oracle数据库的朋友都比较熟悉了,下面将为您介绍的是查询Oracle日志文件的几种方法,供您参考学习. 1.查询系统使用的是哪一组日志文件: select * fr ...

  2. oracle 可以用正则么,在Oracle中使用正则表达式

    正则表达式是功能强大且实用的字符串操作工具. 您可以使用某些字符及其组合逻辑来执行灵活,强大的搜索,匹配和替换字符串操作. 作为行业的领导者,Oracle对正则表达式提供了更完整的支持. 函数语法 R ...

  3. oracle 正则表达式拆分字符串,oracle中通过正则表达式函数处理逗号分隔的字段...

    这个题目的确不大好写,其实际含义基于一个场景: 比如在oracle的某张表中,有两个字段 A1          B1 1         A,B,C,D, 2         E,F 假如现在的需求 ...

  4. oracle正则表达式截断,在oracle中使用正则表达式截取字符串

    在oracle中使用正则表达式截取字符串 Sql代码 --以下两条语句,将summary按-分解为两段字符串 regexp_substr(summary, '[^-]+', 1, 1) as _wor ...

  5. oracle中正则表达式规则,Oracle中的正则表达式(及函数)详解

    1.概述 相信大家对正则表达式都不陌生,从linux下的命令到Java等编程语言,正则表达式无处不在,虽然我们实际使用的时候也并不一定太多,但是当我们要处理字符串时,它确实是一个强大的工具. 上一篇文 ...

  6. oracle中匹配函数怎么用,Oracle中的正则表达式(及函数)详解

    运算符 在介绍函数前,这里先说明一下Oracle中正则表达式运算符及其描述. 如果不知道他们有什么用,或者也不知道描述说的是什么,没关系,可以先看后面的介绍,就知道他们的含义了. 图片.png ora ...

  7. oracle 汉字正则表达式,在Oracle中使用正则表达式

    正则表达式是一种强大的实用的字符串操作工具,可以用一定的字符及其组合逻辑进行灵活.强大的查找.匹配.替换等字符串操作.Oracle作为数据库行业执牛耳者,对正则表达式支持比较完善. Oracle正则表 ...

  8. Linux中最危险的是个命令(很有趣呦~)(链接:http://os.51cto.com/art/201408/448756.htm)

    1.[英文] 10 Most Dangerous Commands – You Should Never Execute on Linux by Editor | Published: Novembe ...

  9. Oracle中Hint深入理解(原创)

    http://czmmiao.iteye.com/blog/1478465 Hint概述  基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明 ...

最新文章

  1. 【Linux shell】sed实践(2)
  2. Linux CentOS 修改服务器主机名hostname
  3. 树莓派3_win10下使用远程桌面连接与树莓派通信(使用VNC实现连接后)
  4. arcserver连接oracle,ArcSDE的二种连接方式(应用服务器连接,直接连接)
  5. C# 在自定义的控制台输出重定向类中整合调用方信息
  6. 如何求卡特兰数——代码如下
  7. 数据结构与算法 完整版双链表
  8. 软件开发通识之二:如何从零开始学编程
  9. C语言网络编程:recv函数详解
  10. iPS细胞技术难点以及iPS相关实验材料
  11. 虚拟机黑苹果连接本地服务器错误,虚拟机装黑苹果遇问题。。。
  12. python中的sin函数_Python sin() 函数
  13. WebSocket 是什么原理?为什么可以实现持久连接?
  14. 「面向对象程序设计-C++」学习笔记(下半部分)
  15. 微信小程序 云开发 欢迎登录注册
  16. 实现一个小程序分享图 wxml2canvas
  17. 市面上有哪几种门_卧室门怎么选?市面上5种常见房门大揭秘
  18. 学籍信息管理系统 c语言,c语言学籍信息管理系统设计
  19. C++排序——Bookshelf B
  20. 什么叫做真正地活出自我

热门文章

  1. Node.js express 入门示例1
  2. Python爬虫! 单爬,批量爬,这都不是事!
  3. 【opencv】图像细化
  4. linux中的umask 函数
  5. 直接设置Activity的背景颜色
  6. Typeface 字体样式
  7. webkit如何实现JS DOM binding—基于V8分析
  8. Java线程之两种方法Runnable和Thread的区别
  9. JQuery 源码解析资料
  10. 设计模式—工厂模式之简单工厂模式