正则表达式之regexp_instr—part1

附件

fj.png正则表达式之regexp_instr—part1.pdf

前言

instr函数基本可以实现常规的一些功能需求,通过强化的正则达式化的regexp_instr可以达到一些高级自定义化的功能


测试结论

1,regexp_instr有7个参数
2,有些参数可以不提供参数值,数据库会自动提供一个默认值


测试明细

1,如果未找到匹配字符串,返回0,如何匹配字符串,依赖于参数 return_opt
2,regexp_instr各个参数含义:
   2.1,source_char,它是用于查找的源字符串,通常它是一个字符列,可以是 
          CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB,NCLOB类型的任何数据
   2.2,pattern,正则表达式,通常是一个文本常量,类型为CHAR,VARCHAR2,NCHAR,NVARCHAR2
         它最多可以包含512字节;
         如果PATTERN数据类型不同于SOURCE_CHAR,数据库会自动把它转换为与SOURCE_CHAR一致

         PATTERN包含的可以支持的正则表达式
完整及权威的正则表达式相关信息,请参考:ORACLE DATABASE ADVANCED APPLICATION DEVELOPERS’S GUIDE.
(为了完整起见,我会列举中英语对译,便于我及大家参考,如果你英语好直接看英语即可^^)


Table D-1 Regular Expression Operators and Metasymbols
Operator Description

\


The backslash character can have four different meanings depending on the context. It can:
这是一个反斜杠字符,在不同的场景中有4种不同的含义:
  • Stand for itself    代表它自己

  • Quote the next character  引用下一个字符

  • Introduce an operator  引入一个操作符

  • Do nothing 什么也不作

*

Matches zero or more occurrences 匹配0或多个发生的事件(事件即匹配的行为)

+


Matches one or more occurrences 匹配1或多个发生的事件

?

Matches zero or one occurrence 匹配0或1个发生的事件

|


Alternation operator for specifying alternative matches
指定多个可以替代或可选的的匹配的发生事件(即就是或的关系,或为OR)

^


Matches the beginning of a string by default. In multiline mode, it matches the beginning of any line anywhere within the source string.
默认从一个字符开始进行匹配查找,如果处于多行模式,它会从源字符串的任何行开头进行匹配

$


Matches the end of a string by default. In multiline mode, it matches the end of any line anywhere within the source string.
与^正好相反,它是从一个字符的结束开始查找,在多行模式下,同上相反

.


Matches any character in the supported character set except NULL
除了NULL外,匹配查找任何可以被支持的字符集的字符

[ ]


Bracket expression for specifying a matching list that should match any one of the expressions represented in the list. A non-matching list expression begins with a circumflex (^) and specifies a list that matches any character except for the expressions represented in the list.
括号表达式,它会指定一个匹配的列表,即会匹配查找这个列表中的任何一个表达式(也就是说会在括号中包括一众表达式,只要匹配其中一个表达式即可)
非匹配列表表达式,即以^开头,即匹配时,不能匹配这些指定的表达式


To specify a right bracket (]) in the bracket expression, place it first in the list (after the initial circumflex (^), if any).
为了在括号表达式中指定一个右括号,会把它放在列表的开头(注意如果存在^,是在最开始的^之后哟)




To specify a hyphen in the bracket expression, place it first in the list (after the initial circumflex (^), if any), last in the list, or as an ending range point in a range expression.
如果想在括号表达式中指定一个连字符,把它放在列表的开头(注意如果存在^,是在最开始的^之后哟),列表的结束,或者在一个范围表达式中作为结束的范围结束点

( )


Grouping expression, treated as a single subexpression
分组表达式,会被视为一个单一的子表达式

{m}


Matches exactly m times
精确匹配多次(多次由M指定)

{m,}


Matches at least m times
至少匹配多次

{m,n}


Matches at least m times but no more than n times
至少匹配M次,但至多N次


\n


The backreference expression (n is a digit between 1 and 9) matches the nth subexpression enclosed between '(' and ')' preceding the \n
反向引用表达式(N表示1至9的中任何一个数字),去匹配在( )之间的第N个子表达式,一直到换行符结束

[..]


Specifies one collation element, and can be a multicharacter element (for example, [.ch.] in Spanish)
指定1个核对或验证的元素,可能是一个多字符元素哟(如:西班牙语中的[.ch.])

[: :]


Specifies character classes (for example, [:alpha:]). It matches any character within the character class.
指定字符类型(如:[:alpha:]),它会去匹配这个字符类型中的任何字符(类似于模糊匹配一样)

[==]


Specifies equivalence classes. For example, [=a=] matches all characters having base letter 'a'.
指定等值类型,如: [=a=],会去匹配具有基字符A的所有字串

3,POSITION是一个正值的数值,表示匹配查找从源字符串哪个位置开始查找匹配;默认是1

4,OCCURRENCE,是一个正值的数值,表示从源字符串中匹配查找正则达式第几个匹配成功的位置开始查找;默认是1
     如果大于1,从指定的匹配成功的位置开始匹配查找

    这个匹配查找行为不同于INSTR,从第1次匹配查找成功的第2次字符第2次匹配查找的对应位置开始,匹配查找哟

5,return_option,指定或控制与匹配查找成功事件,数据库应返回什么数值
        如果指定0,数据库返回匹配查找成功对应字符串的第1个字符位置,这是默认值
   
        如果指定1,数据库返回匹配查找成功对应字符串位置的其后的字符位置

6,MATCH_PARAMETER,是一个文本常量,改变匹配的默认行为,此参数的行为和REGEXP_COUNT是一样的

      可以为此参数指定1或多个参数值:
  
           ‘i’,指定不进行大小写敏感匹配

           ‘c’,指定大小写敏感匹配

           ’n’,允许. 句号,可以是任何匹配的字符,为了匹配换行字符。
               如果忽略这个参数,句号不会匹配换行字符

            ‘m’,认为源字符串为多行记录,数据库解读^与$为开始及结束(源字符串中的任何行哟)
                 但如果你忽略此参数,数据库会认为源字符串为单一记录行而非多行记录

            ‘x’,,忽略空格字符串。默认情况下,数据库会匹配空格字符串


      如果你指定上述多个参数组合,比如:’ic’,数据库会采用最后的参数值,即’c'
      如果你指定非上述的参数值,数据库返回一个错误


      如果你忽略了参数match_parameter,数据库处理如下:
       1,默认的大小写匹配模式取决于nls_sort参数的值
       2,   .句号不匹配换行字符
       3,源字符串被认为是单一记录而非多条记录


7,对于附带子表达式的正则表达式(即子表达式是对正则表达式进一步细化自定义强化),子表达式是一个0至9的整数,
     在正则表达式的子表达式它是函数
      子表达式它是由括号括起来的正则表达式的一部分,而且子表达式可以被嵌套
      如:0123(((abc)(de)f)ghi)45(678)

      这个正则表达式由5个子表达式构成,分别为:abcdefghi,abc,de,678

      如果子表达式为0,会返回匹配pattern的位置
      如果子表达式大于0,会返回匹配对应于子表达式的的位置
      如果pattern不包括至少其中一个子表达式,则返回0

      null的子表达式返回null

      默认子表达式为0
     
示例:
从源字符串 zxy my father,abc第1个字符开始查找或为X或为Y的出现位置
SQL> select regexp_instr('zxy myfather,abc','[xy]',1) from dual;

REGEXP_INSTR('ZXYMYFATHER,ABC','[XY]',1)
----------------------------------------
2

从源字符串zxy myfather,abc第2次匹配成功查找或X或Y的出现位置
SQL> select regexp_instr('zxy myfather,abc','[xy]',1,2) from dual;

REGEXP_INSTR('ZXYMYFATHER,ABC','[XY]',1,2)
------------------------------------------
3

以忽略大小写模式在源字符串中从开始字符查找X的出现位置
SQL> select regexp_instr('zxy myfather,abc','[x]',1,1,0,'i') from dual;

REGEXP_INSTR('ZXYMYFATHER,ABC','[X]',1,1,0,'I')
-----------------------------------------------
2

SQL> select regexp_instr('zxy myfather,abc','[X]',1,1,0,'i') from dual;

REGEXP_INSTR('ZXYMYFATHER,ABC','[X]',1,1,0,'I')
-----------------------------------------------
2

共计7个参数,以忽略大小写模式在源字符串中从开始字符查找X的出现位置其后的位置,所以3
SQL> select regexp_instr('zxy myfather,abc','[X]',1,1,1,'i') from dual;

REGEXP_INSTR('ZXYMYFATHER,ABC','[X]',1,1,1,'I')
-----------------------------------------------
3

获取正则表达式的第3个子表达式即x在源字符串出现的位置
SQL> select regexp_instr('zxy myfather,abc','(z)(x)(y)',1,1,0,'i',3) from dual;

REGEXP_INSTR('ZXYMYFATHER,ABC','(Z)(X)(Y)',1,1,0,'I',3)
-------------------------------------------------------
3

SQL> select regexp_instr('my father','[ ]+',1,1) from dual;

REGEXP_INSTR('MYFATHER','[]+',1,1)
----------------------------------
3

获取非空字符的出现位置
SQL> select regexp_instr('my father','[^ ]+',1,1) from dual;

REGEXP_INSTR('MYFATHER','[^]+',1,1)
-----------------------------------
1

获取空字符的出现位置
SQL> select regexp_instr('my father','[ ]+',1,1) from dual;

REGEXP_INSTR('MYFATHER','[]+',1,1)
----------------------------------
3


个人简介

8年oracle从业经验,具备丰富的oracle技能,目前在国内北京某专业oracle服务公司从事高级技术顾问。
服务过的客户:
中国电信
中国移动
中国联通
中国电通
国家电网
四川达州商业银行
湖南老百姓大药房
山西省公安厅
中国邮政
北京302医院     
河北廊坊新奥集团公司

 项目经验:
中国电信3G项目AAA系统数据库部署及优化
中国联通CRM数据库性能优化
中国移动10086电商平台数据库部署及优化
湖南老百姓大药房ERR数据库sql优化项目
四川达州商业银行TCBS核心业务系统数据库模型设计和RAC部署及优化
四川达州商业银行TCBS核心业务系统后端批处理存储过程功能模块编写及优化
北京高铁信号监控系统RAC数据库部署及优化
河南宇通客车数据库性能优化
中国电信电商平台核心采购模块表模型设计及优化
中国邮政储蓄系统数据库性能优化及sql优化
北京302医院数据库迁移实施
河北廊坊新奥data guard部署及优化
山西公安厅身份证审计数据库系统故障评估
国家电网上海灾备项目4 node rac+adg 
          贵州移动crm及客服数据库性能优化项目
          贵州移动crm及客服务数据库sql审核项目
          深圳穆迪软件有限公司数据库性能优化项目
联系方式:
手机:18201115468
qq   :   305076427
qq微博: wisdomone1
新浪微博:wisdomone9
qq群:275813900    
itpub博客名称:wisdomone1     http://blog.itpub.net/9240380/

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9240380/viewspace-1700367/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9240380/viewspace-1700367/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值