`
weishaoxiang
  • 浏览: 93277 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

ORACLE学习笔记系列(10)正则表达式

 
阅读更多
ORACLE学习笔记系列(10)正则表达式


一、元字符:

^	匹配字符串的开头位置	--如果A是字符串的第一个字符,^A 匹配 A
$	匹配字符串的末尾位置	--如果B是字符串的最后一个字符,$B 匹配 B
*	匹配前面的字符0次或多次	--ba*rk可以匹配 brk、bark、baark等等
+	匹配前面的字符1次或多次	--ba+rk可以匹配 bark、baark等等,但是不能匹配brk,a最少有以一次。
?	匹配前面的字符0次或1次	--ba?rk可以匹配 bark、brk等等,但是不能匹配baark。
.	匹配除null以外的任意单个字符	--hob.it中的.可以是任意的单个字符,如:hobsit等等
|	匹配“或”,指明两项之间的一个选择。	--x|y可以匹配x或者y;例子'^([a-z]+|[0-9]+)$'表示所有小写字母或数字组合成的字符串。
\	反斜线字符说明要匹配的字符是一个特殊字符、常量或者后者引用。(后引用重复上一次的匹配)--	\n 匹配换行符; \\ 匹配 \ ;  \( 匹配 ( ;  \) 匹配 )      
\n	这是对前一次匹配命中的一个后引用,其中n是一个正整数	--(.)\1可以匹配两个连续相同的非空字符。(.)可以匹配除null以外的任何单个字符,而\1则重复上一次匹配的内容,即再次匹配相同的字符,因此可以匹配两个连续相同的非空字符

'{n}'	匹配前面的字符恰好是n次,其中n是整数	--hob{2}it可以匹配hobbit
'{m,n}' 一个精确地出现次数范围,m=<出现次数<=n,'{m}'表示出现m次,'{m,}'表示至少出现m次。  其中n,m都是整数	--hob{2,3}it可以匹配hobbit或者hobbbit
'( )' 分组表达式,看作单个子表达式。标记一个子表达式的开始和结束位置。--如:aaa(x|y)可以匹配aaax或者aaay。
'[]'  方括号表示指定一个匹配列表,该列表匹配列表中显示的任何表达式。 
'[^]' 同上面相反,非匹配列表表达式。 
'[abc]'	可以匹配abc中的任何单个字符	--hello[abc]可以匹配helloa,hellob,helloc
'[a-z]'	可以匹配指定范围内的任何单个字符	--hell[a-z]可以匹配hello或者hellz
'[::]'	指定一个字符类,可以匹配该类中的任何字符	
      [:alnum:] 所有的字母和数字字符,可以匹配字符0-9、A-Z、a-z    
      [:alpha:] 所有的字母字符,可以匹配字符A-Z、a-z  
      [:blank:] 可以匹配空格或tab键   
      [:cntrl:] 所有的控制字符(不会打印出来)   
      [:digit:] 所有的数字,可以匹配数字0-9 
      [:graph:] 可以匹配非空字符,所有的[:punct:]、[:upper:]、[:lower:]和[:digit:]字符   
      [:lower:] 可以匹配小写字母a-z 
      [:print:] 与[:graph:]类似,不同之处在于[:print:]包括空格字符   
      [:punct:] 所有的标点符号,可以匹配标点符号.,""""等等   
      [:space:] 所有的空隔字符(不会打印出来)   
      [:upper:] 可以匹配大写字母A-Z   
      [:xdigit:] 所有有效的十六进制字符,相当于[0-9a-fA-F] 
      
 
二、各种操作符的运算优先级: 
\转义符  
(), (?:), (?=), [] 圆括号和方括号  
*, +, ?, {n}, {n,}, {n,m} 限定符  
^, $, anymetacharacter 位置和顺序  

三、Oracle中支持的正则表达式函数:
        (1)REGEXP_LIKE:   与LIKE 的功能相似  
        (2)REGEXP_INSTR:  与INSTR 的功能相似  
        (3)REGEXP_SUBSTR: 与SUBSTR 的功能相似  
        (4)REGEXP_REPLACE:与REPLACE 的功能相似  
        (5)REGEXP_COUNT:  与LENGTH 的功能相似  

 

 

(1)REGEXP_LIKE 函数  

语法: 
--REGEXP_LIKE 与 LIKE 函数相同,返回布尔类型 
REGEXP_LIKE(srcstr, pattern [,match_option]) 

注: 
   srcstr          源字符串 
   pattern         正则表达式样式  
   match_option    匹配选项(区分大小写) 
   
其中match_option的取值范围如下:
    i:大小写不敏感;
    c:大小写敏感;
    n:点号 . 不匹配换行符号;
    m:多行模式;
    x:扩展模式,忽略正则表达式中的空白字符。
 
create table B
(
  id   NUMBER,
  name VARCHAR2(100)
);

--数据插入    
INSERT INTO B VALUES ('1', '20140107');
INSERT INTO B VALUES ('2', '2014-01-07');
INSERT INTO B VALUES ('3', '2014-01-07 21:15:27');
INSERT INTO B VALUES ('4', '2014年1月7日星期二');
INSERT INTO B VALUES ('5', 'http://weishaoxiang.iteye.com');
INSERT INTO B VALUES ('6', 'weishaoxiang');
INSERT INTO B VALUES ('7', '吉祥如意');
INSERT INTO B VALUES ('8', '088-12345678');
INSERT INTO B VALUES ('9', 'weishaoxiang@163.com');
INSERT INTO B VALUES ('10', '1881234567');
INSERT INTO B VALUES ('11', 'M00588');
INSERT INTO B VALUES ('12', '297187');
INSERT INTO B VALUES ('13', '192.168.0.102');
INSERT INTO B VALUES ('14', 'F5-DE-F3-E7-B9-99');
INSERT INTO B VALUES ('15', 'who are you');
INSERT INTO B VALUES ('16', '來 時  歡   喜 去 時  悲,空在 人間  走一回。');
INSERT INTO B VALUES ('17', '2M00K88');
INSERT INTO B VALUES ('18', 'aaBB');
INSERT INTO B VALUES ('19', 'aaBBff');
INSERT INTO B VALUES ('20', 'GGpp');
INSERT INTO B VALUES ('21', 'LLOVEYOU');
INSERT INTO B VALUES ('22', '^_^ >_< $@$ ');

--查询以 20开头 07结束的记录并且长度是 8位    
SELECT * FROM B WHERE NAME LIKE '20____07';
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '20....07');

--查询以 20开头 07结束的记录并且长度是 8位,并且全部是数字的记录      
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '20[0-9]{4}07');
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '20[[:digit:]]{4}07');

--查询以 29 或者 2m 开头的记录,不区分大小写   
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '^2[9m]', 'i');
--查询以 29 或者 2m 开头的记录,区分大小写    
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '^2[M9]');

SELECT * FROM B WHERE NOT REGEXP_LIKE(NAME, '^[[:digit:]]+$'); -- 查询不是纯数字的记录
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '^[[:digit:]]+$'); -- 查询是纯数字的记录
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '^[0-9]+$'); -- 查询是纯数字的记录
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '^[^[:digit:]]+$'); -- 查询不含数字的记录
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '[[:digit:]]'); -- 查询含数字的记录
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '[0-9]'); -- 查询含数字的记录

SELECT * FROM B WHERE NOT REGEXP_LIKE(NAME, '^[[:alpha:]]+$'); -- 查询不是纯字母字符的记录
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '^[[:alpha:]]+$'); -- 查询是纯字母字符的记录(全中文也会匹配)
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '^[^[:alpha:]]+$'); -- 查询不含字母字符的记录
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '[[:alpha:]]'); -- 查询含字母字符的记录

SELECT * FROM B WHERE REGEXP_LIKE(NAME, '[[:alnum:]]'); -- 查询含字母和数字字符的记录
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '[^[:alnum:]]'); -- 查询含字母和数字字符之外其他字符的记录
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '^[^[:alnum:]]+$'); -- 查询不含字母和数字字符的记录

SELECT * FROM B WHERE REGEXP_LIKE(NAME, '[[:blank:]]'); -- 查询含空格的记录
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '[[:space:]]'); -- 查询含空格的记录
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '[[:lower:]]'); -- 查询含小写字母的记录
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '[[:upper:]]'); -- 查询含大写字母的记录
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '[[:punct:]]'); -- 查询含标点符号的记录 

SELECT * FROM B WHERE REGEXP_LIKE(NAME, '^[[:lower:]]+$'); -- 查询全小写字母的记录
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '^[[:upper:]]+$'); -- 查询全大写字母的记录
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '^[a-z]+$'); -- 查询全小写字母的记录
SELECT * FROM B WHERE REGEXP_LIKE(NAME, '^[A-Z]+$'); -- 查询全大写字母的记录



1、验证字符串全部由字母组成 
SELECT CASE
         WHEN REGEXP_LIKE('Google', '^[[:alpha:]]{6}$') THEN
          'Match Found'
         ELSE
          'No Match Found'
       END
  FROM DUAL;
  
在上面这个例子中,通过正则表达式来验证字符串是否由 6 个字母组成。
 
^              表示行的开始 
[[:alpha:]]    表示字母 
{6}            表示匹配的次数,这里表示匹配6次 
$              表示行的结尾 

2、验证字符串全部由小写字母组成 
SELECT CASE 
         WHEN regexp_like('Terminator', '^([[:lower:]]{3,12})$') THEN 
          'Match Found' 
         ELSE 
          'No Match Found' 
       END  
  FROM dual; 
 
这里如果我们把输入字符串改成“terminator”,则结果就是匹配了。
上面的例子中,通过正则表达式来验证字符串是否由 3 到 12 个小写字母组成。
其中: {3,12}   表示匹配次数,最少3次,最多12次 


3、区分大小写 
SELECT CASE 
         WHEN regexp_like('Republic Of India', 'of', 'c') THEN 
          'Match Found' 
         ELSE 
          'No Match Found' 
       END  
  FROM dual; 
 
上面的例子中,通过正则表达式来验证字符串是否包含小写的“of”。
其中: c 表示完全匹配,区分大小写 


4、匹配第 n位置的字符 
SELECT CASE
         WHEN REGEXP_LIKE('ter*minator', '^...[^[:alnum:]]') THEN
          'Match Found'
         ELSE
          'No Match Found'
       END
  FROM DUAL;
 
在上面的例子中,通过正则表达式来验证字符串“ter*minatory”的第 4 位的字符。
其中: 
^              表示行的开始 
.              表示匹配任意一个的字符(… 表示3个任意的字符) 
[^[:alnum:]]   表示匹配不是字母和数字(^ 在方括号内,表示否定) 


5、查找控制字符 
SELECT CASE
         WHEN REGEXP_LIKE('Super' || CHR(13) || 'Star', '[[:cntrl:]]') THEN
          'Match Found'
         ELSE
          'No Match Found'
       END
  FROM DUAL;
 
上面的例子中,通过正则表达式来验证字符串中是否包含控制符。
(13在ASCII码中表示回车符) 

6、验证 SSN 
SELECT CASE
         WHEN REGEXP_LIKE('987-65-4321', '^[0-9]{3}-[0-9]{2}-[0-9]{4}$') THEN
          'Match Found'
         ELSE
          'No Match Found'
       END
  FROM DUAL;
 
其中: 
^          表示行的开始 
[0-9]{3}   表示3个数字 
-          表示连字号“-” 
[0-9]{2}   表示2个数字 
-          表示连字号“-” 
[0-9]{4}   表示4个数字 
$          表示行的结束 


7、验证 email地址 
SELECT CASE
         WHEN REGEXP_LIKE('oracle@163.com',
                          '^([[:alnum:]]+(_?|\.))[[:alnum:]]*@[[:alnum:]]+(\.([[:alnum:]]+)){1,2}$') THEN
          'Match Found'
         ELSE
          'No Match Found'
       END
  FROM DUAL;
  
 
将上面的正则表达式通过字符“@”分为两部分: 
前半部分 ^([[:alnum:]]+(_?|\.))[[:alnum:]]* ,
其中: 
^       表示行的开始 
([[:alnum:]]+(_?|\.)) 表示匹配以1个或多个字符或者数字字符,紧跟着字符“_”或者字符“.”
[[:alnum:]]* 表示匹配0个或者多个字母或者数字字符 

后半部分 [[:alnum:]]+(\.([[:alnum:]]+)){1,2}$,
其中: 
[[:alnum:]]+ 表示匹配1个或者多个字母或者数字字符 
(\.([[:alnum:]]+)){1,2} 表示匹配1个或者2个,“.”加上1个或者多个字母或者数字字符(例如:.com.cn 或者 .co.in) 
$       表示行的结尾 
 
其中“\.”中“\”表示转义符,因为“.”是关键字符,匹配任意字符,所以需要转义符。 
 

 

 

(2)REGEXP_INSTR 函数 

REGEXP_INSTR 函数使用正则表达式返回搜索模式的起点和终点。 
REGEXP_INSTR 返回一个整数,指出搜索模式的开始或结束的位置,如果没有发现匹配的值,则返回 0。 
语法: 
--REGEXP_INSTR与INSTR函数相同,返回字符串位置 
REGEXP_INSTR(srcstr, pattern [, position [, occurrence [, return_option [,match_option]]]])  

注:
    srcstr 待匹配的字符串  
    pattern 待匹配的模式  
    position   开始匹配的位置,如果不指定默认为1  
    occurrence 匹配的次数,如果不指定,默认为1  
    return_option 指定返回值的类型,如果该参数为 0,则返回值为匹配位置的第一个字符,如果该值为非0则返回匹配值的最后一个位置。  
    match_option  可以用这个参数来修改一些默认的配置设置。 
 
其中match_option的取值范围如下:
    i:大小写不敏感;
    c:大小写敏感;
    n:点号 . 不匹配换行符号;
    m:多行模式;
    x:扩展模式,忽略正则表达式中的空白字符。

示例:

--从给定字段的第一个字符开始查找 a 字串,返回查找到第一个 a的位置 
SELECT INSTR('avdsdabasdab', 'a', 1, 1) FROM DUAL;

--从给定字段的第一个字符开始查找 a 字串,返回查找到第二个 a的位置 
SELECT INSTR('avdsdabasdab', 'a', 1, 2) FROM DUAL;

--从给定字段的第六个字符开始查找 a 字串,返回查找到第一个 a的位置 
SELECT INSTR('avdsdabasdab', 'a', 6, 1) FROM DUAL;

--如果return_option 为0 则,Oracle 返回第一个字符出现的位置。这是默认值,与INSTR的作用相同 
SELECT REGEXP_INSTR('abc1def', '[[:digit:]]') OUTPUT FROM DUAL;

--如果return_option 为1,则Oracle 返回跟在所搜索字符出现以后下一个字符的位置。 
--例如,下面的查询返回了在串中发现的第一个数字的位置: 
SELECT REGEXP_INSTR('abc1def', '[[:digit:]]', 1, 1, 1) OUTPUT FROM DUAL;
 

 

 

(3)REGEXP_SUBSTR 函数 
 
语法: 
--REGEXP_SUBSTR与SUBSTR函数相同,返回截取的子字符串 
REGEXP_SUBSTR(srcstr, pattern [, position [, occurrence [, match_option]]]) 
注: 
   srcstr          源字符串 
   pattern         正则表达式样式 
   position        开始匹配字符位置(默认值是“1”)
   occurrence      匹配出现次数 (默认值是“1”)
   match_option    匹配选项(区分大小写) 
   
其中match_option的取值范围如下:
    i:大小写不敏感;
    c:大小写敏感;
    n:点号 . 不匹配换行符号;
    m:多行模式;
    x:扩展模式,忽略正则表达式中的空白字符。
   
  
示例:
   
1、从字符串中截取子字符串
SELECT REGEXP_SUBSTR('2014年\01月\10日 Welcome,new YEAR2014', '[[:alnum:]]+') FROM DUAL;
SELECT regexp_substr('2014年\01月\10日 Welcome,new YEAR2014', '[[:alnum:]]+', 1, 2) FROM dual; 
SELECT regexp_substr('2014年\01月\10日 Welcome,new YEAR2014', '[[:alnum:]]+', 1, 4,'i') FROM dual; 
说明:pattern = [[:alnum:]]+ :表示匹配1个或者多个字母或数字字符
      position = 1 :表示从源字符串的第一个字符开始查找匹配(默认值是“1”)
      occurrence = 4 : 表示第4次匹配到的字符串 (默认值是“1”)
      match_option = 'i': 表示不区分大小写 
 
SELECT REGEXP_SUBSTR('@@/2013-01-11/ORCL', '@*[[:alnum:]]+') FROM DUAL;
SELECT REGEXP_SUBSTR('1@/2013-01-11/ORCL', '@+[[:alnum:]]*') FROM DUAL;
SELECT REGEXP_SUBSTR('1@/2013-01-11/ORCL', '@+[[:alnum:]]+') FROM DUAL;
SELECT REGEXP_SUBSTR('@1ORACLE/2013-01-11/ORCL125', '[[:digit:]]+$') FROM DUAL;
SELECT REGEXP_SUBSTR('@1ORACLE/2013-01-11/ORCL', '[^[:digit:]]+$') FROM DUAL;
SELECT REGEXP_SUBSTR('oracle@163.com', '[^@]+') FROM DUAL;
SELECT REGEXP_SUBSTR('1ORACLE/2013-01-11/ORCL', '[[:alnum:]]*', 1, 2) FROM DUAL;

说明:需要区别“+”和“*”的区别  
@* 表示匹配0个或者多个@ 
@+ 表示匹配1个或者多个@  
[^@]+ 表示匹配1个或者多个不是“@”的字符
[[:alnum:]]+ 表示匹配1个或者多个字母或数字字符 
[[:alnum:]]* 表示匹配0个或者多个字母或数字字符   
[[:digit:]]+$ 表示匹配1个或者多个数字结尾的字符  
[^[:digit:]]+$ 表示匹配1个或者多个不是数字结尾的字符   

2、匹配重复出现 
查找连续2个大写字母 
SELECT REGEXP_SUBSTR('HELLO,welcome to you!', '([A-Z])\1', 1, 1, 'c')
  FROM DUAL;

说明:
      pattern = ([a-z])\1 :表示小写字母a-z,\1 表示匹配前面的字符的连续次数
      position = 1 :表示从源字符串的第一个字符开始查找匹配(默认值是“1”)
      occurrence = 4 : 表示第4次匹配到的字符串 (默认值是“1”)
      match_option = 'c': 表示区分大小写 
  
查找连续3个的数字 
SELECT REGEXP_SUBSTR('19988000555', '([0-9])\1\1') FROM DUAL;
SELECT CASE
         WHEN REGEXP_LIKE('19988000555', '([0-9])\1\1') THEN
          'Match Found'
         ELSE
          'No Match Found'
       END  
  FROM DUAL;
   

3、其他一些匹配样式 
查找网页地址信息 
SELECT REGEXP_SUBSTR('welcome to http://weishaoxiang.iteye.com/blog/1997112',
                     'http://([[:alnum:]]+\.?){3,4}/?') RESULT
  FROM DUAL;
  
说明: 
http://             表示匹配字符串“http://” 
([[:alnum:]]+\.?)   表示匹配1次或者多次字母或数字字符,紧跟0次或1次逗号符 
{3,4}               表示匹配前面的字符最少3次,最多4次 
/?                  表示匹配一个反斜杠字符0次或者1次 

4、提取 csv 字符串中的第三个值 
SELECT REGEXP_SUBSTR('2014年,01月,10日,Welcome,new,YEAR,2014', '[^,]+', 1, 3)  
  FROM DUAL;
  
说明:
      pattern = [^,]+     表示匹配1个或者多个不是逗号的字符
      position = 1 :表示从源字符串的第一个字符开始查找匹配(默认值是“1”)
      occurrence = 3 : 表示第3次匹配到的字符串 (默认值是“1”) 

5、字符串的列传行 
SELECT REGEXP_SUBSTR('2014年,01月,10日,Welcome,new,YEAR,2014', '[^,]+', 1, LEVEL)  
  FROM DUAL
CONNECT BY LEVEL <= LENGTH('2014年,01月,10日,Welcome,new,YEAR,2014') -
           LENGTH(REPLACE('2014年,01月,10日,Welcome,new,YEAR,2014', ',')) + 1;
           
6、通过 LEVEL 来循环截取匹配到的字符串。 
下面这个例子,查找源字符串中是否包含 kid 、kids 或者 kidding 这三个字符串 
SELECT CASE
         WHEN REGEXP_LIKE('Why does a kid enjoy kidding with kids only?',
                          'kid(s|ding)*',
                          'i') THEN
          'Match Found'
         ELSE
          'No Match Found'
       END  
  FROM DUAL;
   
说明: 
kid          表示字符串kid 
(s|ding)*    表示匹配0次或者多次字符“s”或者“ding” 
i            表示不区分大小写 


  

 

 

(4)REGEXP_REPLACE 函数 

REGEXP_REPLACE 函数是用另外一个值来替代串中的某个值。
例如,可以用一个匹配数字来替代字母的每一次出现。
REGEXP_REPLACE 的格式如下所示 
语法: 
--REGEXP_REPLACE与REPLACE函数相同,替换原字符串中的字符内容 
REGEXP_REPLACE(srcstr, pattern [,replacestr [, position [, occurrence [,match_option]]]]) 

注: 
   srcstr          源字符串 
   pattern         正则表达式样式 
   replacestr      替换字符串
   position        开始匹配字符位置(默认值是“1”)
   occurrence      匹配出现次数 (默认值是“1”)
   match_option    匹配选项(区分大小写) 
   
其中match_option的取值范围如下:
    i:大小写不敏感;
    c:大小写敏感;
    n:点号 . 不匹配换行符号;
    m:多行模式;
    x:扩展模式,忽略正则表达式中的空白字符。
    
1、查找替换空格符 
SELECT REGEXP_REPLACE('HELLO,  welcome   to  you!', '[[:blank:]]{2,8}', ' ')
  FROM DUAL;
  
其中:[[:blank:]]{2,8}  表示2到8个空格 
  
SELECT REGEXP_REPLACE('HELLO,  welcome    to  you!', '( ){2,}', ',') 所有连续两个以上的空白改成逗号
  FROM DUAL;

SELECT REGEXP_REPLACE('HELLO,welcome   to      you!', '( )+', ',') 所有连续的空白改成逗号
  FROM DUAL;

SELECT REGEXP_REPLACE('  HELLO,welcome  to you !', '\s+', ',') 所有连续的空白改成逗号
  FROM DUAL;
   
2、格式化字符串 
SELECT REGEXP_REPLACE('04099661234',
                      '([[:digit:]]{3})([[:digit:]]{4})([[:digit:]]{4})',
                      '(\1) \2-\3')  
  FROM DUAL;
 
([[:digit:]]{3}) 表示3个数字   
([[:digit:]]{4}) 表示4个数字  
([[:digit:]]{4}) 表示4个数字  
所以 “(\1) \2-\3” 表示将前3个数字用圆括号,紧跟着一个空格,再跟着中间4个数据,再跟着连字符“-”,最后是后4位的数字。 
 

SELECT REGEXP_REPLACE('04099661234',
                      '^([[:digit:]]{1})([[:digit:]]{2})([[:digit:]]{4})([[:digit:]]{4})$',
                      '+91-\2-\3-\4') AS FORMATTED_PHONE
  FROM DUAL;

 
3、在每两个字符之间插入一个空格符,原字符串中的空格也算一个字符 
SELECT REGEXP_REPLACE('HELLO,welcome to you!', '(.)', '\1 ') FROM DUAL;
 



 

 

(5)REGEXP_COUNT 函数

REGEXP_COUNT 返回在源串中出现的模式的次数,作为对REGEXP_INSTR 函数的补充。
需要注意的是,尽管COUNT 是一个集合函数,它操作的是行组,但REGEXP_COUNT 是一个单行函数,它分别计算每一行。
REGEXP_COUNT 的语法如下所示:  
REGEXP_INSTR(srcstr, pattern [, position [,match_option]])  

注: 
   srcstr          源字符串 
   pattern         正则表达式样式
   position        开始匹配的位置,如果不指定默认为1    
   match_option    匹配选项(区分大小写) 
   
其中match_option的取值范围如下:
    i:大小写不敏感;
    c:大小写敏感;
    n:点号 . 不匹配换行符号;
    m:多行模式;
    x:扩展模式,忽略正则表达式中的空白字符。

REGEXP_COUNT 返回pattern 在srcstr串中出现的次数。如果未找到匹配,则函数返回0。
position 变量告诉Oracle 在源串的什么位置开始搜索。在开始位置之后每出现一次模式,都会使计数结果增加1。

 
示例:

--源字符串中有多少个大写字母 
SELECT REGEXP_COUNT('HELLO,Welcome to you!', '([A-Z])',1,'c') FROM DUAL;

--源字符串中有多少个数据 
SELECT REGEXP_COUNT('a3bc1de5f', '[[:digit:]]')   FROM DUAL;
 
--没有匹配,则返回结果0
SELECT REGEXP_COUNT('HELLO,Welcome to you!', '[[:digit:]]', 1)   FROM DUAL;

--源字符串中包含多少个“O”,不区分大小写
SELECT REGEXP_COUNT('HELLO,Welcome to you!', 'o',1,'i') FROM DUAL;

--源字符串中有多少个空格符
SELECT REGEXP_COUNT('HELLO,  welcome   to  you!', '[[:blank:]]') FROM DUAL; 

--源字符串中有多少个非字母或数字的字符
SELECT REGEXP_COUNT('HELLO, welcome@to$you!', '[^[:alnum:]]') FROM DUAL;

 

 

 

分享到:
评论

相关推荐

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

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

    JavaNotes:自学,存放学习笔记

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

    fergarciafer:我的个人资料

    :telescope: 我目前正在研究有关SQL和正则表达式的新Udemy课程。 :seedling: 我目前正在学习SQLite和Jupyter笔记本。 :speech_balloon: 向我询问我的课程 :grinning_face_with_smiling_eyes: Quote:如果您不能简单...

    2021最新java面试合集pdf.rar

    MongoDB学习笔记.docx mybatis原理.docx MyBatis面试专题.docx MyBatis面试专题及答案.pdf Mybatis面试题(含答案).pdf MySQL性能优化的21个最佳实践.pdf mysql面试专题.docx MySQL面试题(含答案).pdf Netty面试...

    整理后java开发全套达内学习笔记(含练习)

    abstract (关键字) 抽象 ['æbstrækt] ...正则表达式 输出格式控制: 转义符: \ddd 1到3位8进制数指定Unicode字符输出(ddd) \uxxxx 1到4位16进制数指定Unicode字符输出(xxxx) \\ \ \' ' \" ...

    Java学习笔记-个人整理的

    {3.4}正则表达式}{71}{section.3.4} {3.5}StringBuffer}{75}{section.3.5} {3.6}StringBuilder}{76}{section.3.6} {3.7}StringBuilder与StringBuffer的缺点}{76}{section.3.7} {3.8}内部类}{77}{section.3.8} ...

    Java开发详解.zip

    031115_【第11章:Java常用类库】_正则表达式笔记.pdf 031116_【第11章:Java常用类库】_定时调度笔记.pdf 031201_【第12章:JAVA IO】_File类笔记.pdf 031202_【第12章:JAVA IO】_RandomAccessFile笔记.pdf 031203...

    jive.chm

    2 Jive中的分页处理 3 Jive中Jdom使用剖析 4 丰富的图释 5 使用正则表达式让你的jive显示图片 6 Jive3增加帖子的点击功能的高效方法 &lt;br&gt; 国际化支持 1 jive_forums_i18n_zh_...

    Jive资料集

    系统设计 1 jive设计思路 2 jive的工作内幕 3 Jive源代码研究 4 Jive中的设计模式 5 jive学习笔记 &lt;br&gt; &lt;br&gt; 数据库设计 1 Jive Forums数据库说明(英文) 2 Jive KB...

    asp.net知识库

    VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...

Global site tag (gtag.js) - Google Analytics