Oracle数据库查询正则表达式的基本使用

Alex / 5-18 14:47 / 有点意思 /

oracle10g中终于增加了期盼已久的正则表达式功能

    正则表达式中用到的^、$、[0-9]都被称为元数据(metacharacter),正则表达式都是由多元表达式组成的。在这里,^表示一个字符串的开头,$表示一个字符换的结尾,因此^198表示以198开头的字符串,而[0-9]$则表示以0-9的数字结尾的字符串。因此整体上’^198[0-9]$’就能匹配所有1980-1989的字符串。

 

正则表达式中常用到的元数据(metacharacter)如下:

  1. ^  匹配字符串的开头位置。
  2. $  匹配支付传的结尾位置。
  3. *  匹配该字符前面的一个字符0次,1次或者多次出现。例如52*oracle 可以匹配 5oracle,52oracle,522oracle,5222oracle等等。
  4. + 匹配该字符前面的一个字符1次或者多次出现。例如52+oracle 可以匹配 52oracle,522oracle,5222oracle等等
  5. ?  匹配该字符前面的一个字符0次或1次或者多次出现。例如52?oracle 只能匹配5oracle,52oracle等等
  6. {n} 匹配一个字符串n次,n为正整数。例如:hel{2}o 所匹配的是hello
  7. {n,m} 匹配一个字符串至少n次,至多m次。其中n和m都是整数。
  8. .  匹配除了null之外的任何单个字符串
  9. (pattern) 这个是用来匹配指定模式的一个子表达式
  10. x|y  匹配x或者y,其中x和y是一个或者多个字符
  11. [abc] 匹配括号中的任意一个字符。例如:[ab]bc可以匹配abc和bbc
  12. [a-z] 匹配指定范围内的任意字符串。例如[A-G]hi可以匹配Ahi至Ghi
  13. [::]指定一个字符类,可以匹配该类中的任意字符 这里的字符类包括:

  •  [:alphanum:] 可以匹配字符0-9、A-Z、a-z
  •  [:alpha:]可以匹配字符A-Z、a-z
  •  [:blank:]可以匹配空格或者tab键
  •  [:digit:]可以匹配数字 0-9
  •  [:gragh:]可以匹配非空字符
  •  [:punct:]可以匹配. , ” ‘等标点符号。
  •  [:upper:]可以匹配字符A-Z
  •  [:lower:]可以匹配字符a-z

      这里列出的是一些常见的正则表达式中的元数据。更多的正则表达式的内容请参照oracle官网上的正则表达式的相关内容

关于orace中的正则表达式只能通过oracle特意为正则表达式设计的4个函数来使用。这4个函数分别是:

    • regexp_like(x,pattern)    与LIKE的功能相似    当x能正确匹配字符串时返回true。
    • regexp_instr(x,pattern)    与INSTR的功能相似    在x中尝试匹配pattern,并返回匹配的位置。
    • regexp_replace(x,pattern,replacestring)    与SUBSTR的功能相似 在x中尝试匹配pattern,并将其替换成replacestring。
    • regexp_substr(x,pattern)   与REPLACE的功能相似 返回x中匹配pattern的一个字符串。
 
 
 
 

前面我们介绍了oracle中的正则表达式组常用的一个函数regexp_like,这里我们在介绍一个函数regexp_instr。这个正则表达式函数用的不如前一个多,但也会偶尔会用到。这个函数其实与我们前面曾介绍的instr函数其实相似。

regexp_instr的原型如下:
regexp_instr(x,pattern[,start[,occurrence[,return_option[,match_option]]]])
这里每个参数分别含义如下:

x          待匹配的字符串  

pattern    待匹配的模式

start      开始匹配的位置,如果不指定默认1   

occurrence  匹配的次数,如果不指定,默认为1

return_option  指定返回值的类型,如果该参数为0,则返回值为匹配位置的第一个字符,如果该值为非0则返回匹配值的最后一个位置。
match_option 可以用这个参数来修改一些默认的配置设置。这个值与前面所说的regexp_like函数中的match_option参数的意义是一样的。

  1. 经典示例
  2. 查询value中以1开头60结束的记录并且长度是7位
    select * from fzq where value like '1____60';
    select * from fzq where regexp_like(value,'1....60');
    --查询value中以1开头60结束的记录并且长度是7位并且全部是数字的记录。
    --使用like就不是很好实现了。
    select * from fzq where regexp_like(value,'1[0-9]{4}60');
    -- 也可以这样实现,使用字符集。
    select * from fzq where regexp_like(value,'1[[:digit:]]{4}60');
    -- 查询value中不是纯数字的记录
    select * from fzq where not regexp_like(value,'^[[:digit:]]+$');
    -- 查询value中不包含任何数字的记录。
    select * from fzq where regexp_like(value,'^[^[:digit:]]+$');
    --查询以12或者1b开头的记录.不区分大小写。
    select * from fzq where regexp_like(value,'^1[2b]','i');
    --查询以12或者1b开头的记录.区分大小写。
    select * from fzq where regexp_like(value,'^1[2B]');
    -- 查询数据中包含空白的记录。
    select * from fzq where regexp_like(value,'[[:space:]]');
    --查询所有包含小写字母或者数字的记录。
    select * from fzq where regexp_like(value,'^([a-z]+|[0-9]+)$');
    --查询任何包含标点符号的记录。
    select * from fzq where regexp_like(value,'[[:punct:]]');
    /*
    理解它的语法就可以了。其它的函数用法类似。
    */

发表留言:

解决问题:PyDev for Eclipse安装后,window->preference中找不到PyDev java jdbc链接oracle数据库(分6步详解),把结果放入到list中(代码演示)
返回顶部
Themes by lishiyu.cn