正则表达式

发布时间:2016-06-13 11:06:53   来源:文档文库   
字号:

正则表达式

正则表达式离不开这4个函数:

1regexp_like (匹配)比较一个字符串是否与正则表达式匹配 

Select* from tablename where(srcstr, pattern [, match_option])  

2regexp_substr (提取) 返回与正则表达式匹配的子字符串

Select* from tablename where(srcstr, pattern [, position [, occurrence [, match_option]]])

3regexp_instr (包含)在字符串中查找正则表达式,并且返回匹配的位置

Select* from tablename where(srcstr, pattern [, position [, occurrence [, return_option [, match_option]]]])  

4regexp_replace (替换)搜索并且替换匹配的正则表达式   

Select* from tablename where(srcstr, pattern [, replacestr [, position [, occurrence [, match_option]]]])  

参数的含义:

    srcstr:        被查找的字符数据。   

    pattern:       正则表达式。  

    occurrence:    出现的次数。默认为1  

    position:      开始位置  

    return_option: 默认值为0,返回该模式的起始位置;值为1则返回符合匹配条件的下一个字符的起始位置。  

    replacestr:    用来替换匹配模式的字符串。  

    match_option:  匹配方式选项。缺省为c  

                   ccase sensitive  

                   Icase insensitive  

                   n(.)匹配任何字符(包括newline)  

                   m:字符串存在换行的时候被作为多行处理  

正则表达式由以下标准的元字符(metacharacters)所构成:

字符

[[:alpha:]]任何字母。[A-Za-z]

[[:digit:]]任何数字。[0-9]

[[:alnum:]]任何字母和数字。[A-Za-z0-9]

[:blank:]   [ ],标准是空格和TAB,但Oracle里只有空格!

[:cntrl:]   CONTROL

[:graph:]  即所有可见字符,不包括空格

[:print:]  可打印字符 ,即空格+所有可见字符

[[:space:]] 空白字符。

[[:punct:]] 任何标点符号。

[[:upper:]] 任何大写字母。[A-Z]

[[:lower:]] 任何小写字母。[a-z]

[[:xdigit:]]任何16进制的数字,相当于[0-9a-fA-F]

[:class:]   字符类。classalnumdigit等。

[.element.] 整理类。受NLS_SORT影响。将多字节字符当作单字节字符看待。如在西班牙语中chll都是用多字节表示的单字节。

[=char=]    等同类。在当前语言(Locale)下,匹配所有的属于相同的POSIX等同类字符指定的字符。如在西班牙语中,[[=n=]]指定了等同类字符n,它可以匹配El Ni?o中的N ?.

###########################################################################

边界符集合

^   每一行的开头,单行模式下等价于字符串的开头

$   每一行的结尾,单行模式下等价于字符串的结尾

在单行模式下,^\A等价,$\Z等价。

##########################################################################

元字符

###############################################################

组合操作符

[]     方括号内任意字符或字符集合中的一个。在其中所有的操作符号都被视为普通符号,但以下除外:

★范围操作符:- 但当"-"位于字符列表的第一个或最后一个字符时,或位于范围的结尾时,会被当作"-"本身来看待。

当右方括号"]"出现在列表的第一个位置时,它会被当作"]"本身来处理。

[^]    方括号内^为第一个字符时,表示与其后所有字符都不匹配的字符

()     圆括号,将复杂表达式当作单一表达式来处理

..|..    

abc      和。直接将字符连在一起写

优先级比较:圆括号>重复次数操作符>>或。

例如,(f|ht)tps?: 表示

ftp:

ftps:

http:

https:

######################################################################

匹配操作符

\n      即后向引用。n1~9,标识由圆括号里取得的匹配字符串。方向是从左到右。

转义操作符

\       将其后紧跟着的操作字符当作普通字符看待。

例如 abc*def 可以匹配 abdefabcccdef等,但无法匹配abc*def,后者需要abc\*def才能匹配

##################################################

一条正则表达式匹配函数示例解析

SELECT * FORM tablename where  REGEXP_LIKE(SJHM,  '^[1]{1}[358]{1}[[:digit:]]{9}$' ) 

这个语句是从表中查手机号,数字型格式。

^ 表示开始

$ 表示结束 

[]内部为匹配范围

{}里的内容表时个数

手机号码的特点是以 1开头接着是35再加9位的数字 所以这么理解

1开头 表达式为 ^[1]{1} 意为 开始1位里包含1

35 表达式为 [35]{1},即第二位包含有35

9位数字结束 : [[:digit:]]{9}$ 这里[:digit:]为特殊写法,代表为数字,再加个结束符$。即最后9位是数字。

手机号扩展应用

select * from testphone2 where REGEXP_LIKE(phonenumber,'\D*[1]{1}[358]{1}[[:digit:]]{9}\D*') --普通手机号

or REGEXP_LIKE(phonenumber,'\D*[8]{1}[6]{1}[1]{1}[358]{1}[[:digit:]]{9}\D*') --首位是86或者是+86的手机号

or REGEXP_LIKE(chuanhao,'\D*[[:digit:]]{14}\D*') --小米14手机串号

or REGEXP_LIKE(chuanhao,'\D*[[:digit:]]{15}\D*') --15手机串号

or REGEXP_LIKE(sim,'\D*[0-9]{6}[0-9a-zA-Z]{1}[0-9]{5}[0-9a-zA-Z]{1}[0-9]{7}\D*'); --sim卡号,第二行第二个数据可能为字母/数字,第三行的第三个数据可能为字母/数字

这些号码查询实在字符型数据中查询,/D*便是首尾可出现0次或多次除数字型之外的所有字符,例如出现周瑞186********aa,(绿色表示可有可无)

身份证号:isIDCard1=^[1-9]\d{7}((0\d)|(1[0-2])) (([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$; 

本文来源:https://www.2haoxitong.net/k/doc/7171c4d452ea551811a6874f.html

《正则表达式.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式