1、概述

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

上一篇文章(Oracle中的字符串类型及相关函数详解)中,已经介绍了一些串相关的函数,也列出了用于正则表达式的函数,本文就正式介绍他们。

本文基于Oracle 12c ,可能部分内容在较老的版本中不适用。

运算符

在介绍函数前,这里先说明一下Oracle中正则表达式运算符及其描述。

如果不知道他们有什么用,或者也不知道描述说的是什么,没关系,可以先看后面的介绍,就知道他们的含义了。

合理的使用这些运算符,配合正则表达式相关的函数,不但可以让字符串处理变得更加高效,还能大大的减少代码量。

2、相关函数

统一说明:

函数中pattern为正则表达式,最多可以包含512个字节。

下面的介绍中,及时是不同的函数,如若参数描述字符串相同,即他们的意思也是相同的(如regexp_substr函数和regexp_instr函数中的position意思都是表示开始搜索的位置),为了内容紧凑,只在那个参数第一次出现的地方作介绍。

参数带char的表示简单的串类型,带string的可以包含大对象串类型(如clob)。

惯例,“[]”表示可选参数。

2.1、REGEXP_SUBSTR

REGEXP_SUBSTR函数使用正则表达式来指定返回串的起点和终点。

语法:

regexp_substr(source_string,pattern[,position[,occurrence[,match_parameter]]])

source_string:源串,可以是常量,也可以是某个值类型为串的列。

position:从源串开始搜索的位置。默认为1。

occurrence:指定源串中的第几次出现。默认值1.

match_parameter:文本量,进一步订制搜索,取值如下:

'i'     用于不区分大小写的匹配。

'c'    用于区分大小写的匹配。

'n'    允许将句点“.”作为通配符来匹配换行符。如果省略改参数,句点将不匹配换行符。

'm'   将源串视为多行。即将“^”和“$”分别看做源串中任意位置任意行的开始和结束,而不是看作整个源串的开始或结束。如果省略该参数,源串将被看作一行来处理。

如果取值不属于上述中的某个,将会报错。如果指定了多个互相矛盾的值,将使用最后一个值。如'ic'会被当做'c'处理。

省略该参数时:默认区分大小写、句点不匹配换行符、源串被看作一行。

例1:

selectregexp_substr('MY INFO: Anxpp,22,and boy','my',1,1,'i')fromusers;

将返回MY,如果将match_parameter改为'c'将不反悔任何内容(null)。

例2:

selectregexp_substr('MY INFO: Anxpp,23,and boy','[[:digit:]]',1,2)fromusers;

此处会返回3。

注意这里同时用到了“[]”和“[:digit:]”。

2.2、REGEXP_INSTR

REGEXP_INSTR函数使用正则表达式返回搜索模式的起点和终点(整数)。如果没有发现匹配的值,将返回0。

语法:

regexp_instr(source_string,pattern[,position[,occurrence[,return_option[,match_parameter]]]])

return_option:为0时,返回第一个字符出现的位置,与instr作用相同。为1时,返回所搜索字符出现以后下一个字符的位置。默认为0。

例1:

selectregexp_instr('MY INFO: Anxpp,23,and boy','[[:digit:]]')fromusers;

该例会返回16。

REGEXP_INSTR函数常常会被用到where子句中。

2.3、REGEXP_LIKE

通常使用REGEXP_LIKE进行模糊匹配。

语法:

regexp_like(source_string,pattern[match_parameter])

比如,查找电话好吗以666开头的:

selectnamefromuserswhereregexp_like(phone,'666');

例1:

select*fromuserswhereregexp_like('MY INFO: Anxpp,23,and boy','[[:digit:]]');

此例判断串中是否包含数字。

该函数可以使用前面介绍的所有搜索功能作为REGEXP_LIKE搜索的一部分,可以是非常复杂的搜索变得简单。

2.4、REPLACE和REGEXP_REPLACE

REPLACE函数用于替换串中的某个值。

语法:

replace(char,search_string[,replace_string])

如果不指定replace_string,会将搜索到的值删除。

输入可以是任何字符数据类型:char,varchar2,nchar,nchar,nvarchar2,clob或nclob。

例1:

selectreplace('MY INFO: Anxpp,23,and boy','an')fromusers;

返回:MY INFO: Anxpp,23,d boy

下面演示使用该函数计算某字串在源串中出现的次数:

select(length('MY INFO: Anxpp,23,and boy')-length(replace('MY INFO: Anxpp,23,and boy','an')))/length('an')fromusers;

REGEXP_REPLACE是REPLACE的增强版,支持正则表达式,扩展了一些功能。

语法:

regexp_replace(source_string,pattern[,replace_string[,position[,occurrence[,match_parameter]]]])

replace_string表示用什么来替换source_string中与pattern匹配的部分。

occurrence为非负整数,0表示所有匹配项都被替换,为正数时替换第n次匹配。

其他参数在前面都已经介绍过了。

例1:

想象这样一个场景:有一个分布式的爬虫,负责抓取网页的程序已经将数据存入数据库,而当前负责处理的程序需要从其中读取其中的一些数据,包括电话号码。号码一般是11为,前3位区号,中间4位表示交换机,再加上后面4位,格式也不能确定,我们可以试着用下面的SQL来读取,生成我们想要的格式:

selectregexp_replace('电话:023 5868-8888 邮箱:anxppp@163.com',

'.*([[:digit:]]{3})([^[:digit:]]{0,2})([[:digit:]]{4})([^[:digit:]]{0,2})([[:digit:]]{4}).*',

'(1)35'

)phonefromusers;

该例返回:(023)58688888

"1"、“3”、“5”分别表示第1、3、5个数据集。其他的,大家慢慢看就能看懂了。

配合where子句,可以限制要返回的行。

2.5、REGEXP_COUNT

REGEXP_COUNT函数返回在源串中出现的模式的次数,作为对REGEXP_INSTR函数的补充。

虽然COUNT是一个集合函数,操作的是行组,但是REGEXP_COUNT是单行函数,分别计算每一行。

语法:

regexp_count(source_char,pattern[,position[,match_param]])

REGEXP_COUNT返回pattern在source_char串中出现的次数。如果未找到匹配,函数返回0。

metch_param参数,相对于前面介绍的match_parameter参数多一个取值“x”。

'x':忽略空格字符。默认情况下,空格与自身想匹配。

metch_param如果指定了多个互相矛盾的值,将使用最后一个值。

前面介绍了使用replace函数统计字串在源串中出现的次数,这里可以使用REGEXP_COUNT实现,而且看起来更简单:

selectregexp_count('MY INFO: Anxpp,23,and boy','an')fromusers;

返回:1

此处还是使用match_param参数进行不区分大小写搜索:

selectregexp_count('MY INFO: Anxpp,23,and boy','an',1,'i')fromusers;

返回:2

3、总结

以上正则表达式相关函数的使用,主要体现在对正则表达式的掌握程度上,如果精通了正则表达式,一些非常复杂的串处理,也能用比较简洁的代码完成。

oracle中正则表达式规则,Oracle中的正则表达式(及函数)详解相关推荐

  1. php中get_featured_posts()是什么意思,WordPress的Get_Posts()函数详解

    WP中获取POST有两个主要函数,Get_post()和Get_Posts().一个是获取单文章,另外一个是获取多文章,其中,官网对Get_posts()函数的描述很简单.但有的时候描述越简单的函数, ...

  2. linux中recvfrom读取速度,Linux系统调用-- recv/recvfrom 函数详解

    Linux系统调用-- recv/recvfrom函数详解 功能描述: 从套接字上接收一个消息.对于recvfrom,可同时应用于面向连接的和无连接的套接字.recv一般只用在面向连接的套接字,几乎等 ...

  3. insert 语句_替换某字段中的特定字符串——MySQL REPLACE 与INSERT 函数详解

    MySQL提供了一个非常实用的字符串函数--REPLACE() 函数,它允许用新的字符串替换字段中的特定字符串,而不再需要自己写函数去替换,用起来非常的方便. REPLACE() 函数语法 需要注意的 ...

  4. python中反三角函数用法_Python入门之三角函数atan2()函数详解

    python 的 Python入门之三角函数atan2()函数详解 描述 atan2() 返回给定的 X 及 Y 坐标值的反正切值. 语法 以下是 atan2() 方法的语法: import math ...

  5. oracle中正则表达式规则,Oracle SQL 正则表达式

    From:http://blog.sina.com.cn/s/blog_69e7b8d701012tuj.html 在oracle数据库当中有字符处理的函数,比如substr().replace()和 ...

  6. 在oracle中游标的操作,Oracle中的游标和函数详解

    Oracle中的游标和函数详解 1.游标 游标是一种 PL/SQL 控制结构:可以对 SQL 语句的处理进行显示控制,便于对表的行数据 逐条进行处理. 游标并不是一个数据库对象,只是存留在内存中. 操 ...

  7. Oracle中nvl()与nvl2()函数详解

    Oracle中nvl()与nvl2()函数详解: 函数nvl(expression1,expression2)根据参数1是否为null返回参数1或参数2的值: 函数nvl2(expression1,e ...

  8. SQL全方位攻略:5. SQL “方言”大比拼:Oracle、MySQL、PostgreSQL限制检索行数语法详解(分页查询)

    系列文章目录 SQL全方位攻略:1.数据库介绍 SQL全方位攻略:2.SQL介绍 SQL全方位攻略:3.SQL标准 SQL全方位攻略:4. 标准SQL和SQL"方言" 文章目录 系 ...

  9. php中单引号,php中的单引号、双引号和转义字符详解

    PHP单引号及双引号均可以修饰字符串类型的数据,如果修饰的字符串中含有变量(例$name):最大的区别是: 双引号会替换变量的值,而单引号会把它当做字符串输出. 例如: 结果: 字符串$name 字符 ...

  10. 【转】angularjs指令中的compile与link函数详解

    这篇文章主要介绍了angularjs指令中的compile与link函数详解,本文同时诉大家complie,pre-link,post-link的用法与区别等内容,需要的朋友可以参考下 通常大家在使用 ...

最新文章

  1. HashMap 详解七
  2. UIApplication shared application用法总结
  3. 视觉在无人驾驶中的应用及分类_机器视觉在智能化生产中的广泛应用
  4. ㊙️【教你用python挣零花钱】自动化简历内推,学弟直呼牛逼!!
  5. android顶部导航高度,Android特效——————底部/顶部导航条(Fragment+ViewPaper+XTabLayout)...
  6. vb屏蔽文本框点右键时的弹出菜单
  7. 浅谈java中的接口
  8. mysql my.cnf中忽略大小写_修改my.cnf ,使mysql 的表面不区分大小写
  9. iSCSI远程块存储配置实验
  10. 移动硬盘计算机无法打开硬盘,移动硬盘打不开怎么办 硬盘打不开解决方法【详解】...
  11. 试着用markdown
  12. (matlab) figure中画多条线,并对每条线依次加标注
  13. 安装文件MSI文件和EXE文件有什么区别?
  14. 将系统从机械盘重刷到固态盘“
  15. 菲涅尔区,前后比,VSWR
  16. IPHONE 设置 铃声 方法
  17. Visdom蓝屏问题解决
  18. iis7设置html支持asp,图解IIS7如何添加支持asp功能
  19. html怎么加一小部分图片,如何把一张照片放到电脑桌面一小块空地方
  20. 学会​NI-​DAQmx10​个​函数,​解决​80%​的​数据​采集​应用​问题

热门文章

  1. Linux 查看服务器开放的端口号
  2. lua实现多继承-方式2
  3. 如何将文件加添加成webapp
  4. leetcode 782. Transform to Chessboard | 782. 变为棋盘(Java)
  5. C++ 循环链表练习题 报数删除【非常没有条理】
  6. C++ 算法设计 最大子序和问题
  7. 一文了解JDK12 13 14 GC调优秘籍-附PDF下载
  8. JDK 14的新特性:switch表达式
  9. html不可选择的按钮,HTML功能无法使用按钮
  10. 16行代码AC_【第十届蓝桥杯省赛c/c++B组真题解析】7.完全二叉树的权值