美文网首页我爱编程
Oracle正则表达式

Oracle正则表达式

作者: 是阿离 | 来源:发表于2017-09-13 21:09 被阅读0次

    问题

    想要查询tableName结尾不为6位数字的表

    解决方案

    1、最开始用的py脚本通过截取数字类型组成串,判断串的长度来做的……
    2、使用Oracle sql正则表达式

    Oracle sql正则表达式

    ORACLE中的支持正则表达式的函数主要有下面四个:

    1,REGEXP_LIKE :与LIKE的功能相似

    2,REGEXP_INSTR :与INSTR的功能相似

    3,REGEXP_SUBSTR :与SUBSTR的功能相似

    4,REGEXP_REPLACE :与REPLACE的功能相似

    1、正则表达式中的元字符

    元字符 意思 例子 
    说明要匹配的字符是一个特殊字符、常量或者后者引用。(后引用重复上一次的匹配) n 匹配换行符
    \ 匹配 
    ( 匹配 (
    ) 匹配 ) 
    ^ 匹配字符串的开头位置 如果A是字符串的第一个字符,^A 匹配 A 
    $ 匹配字符串的末尾位置 如果B是字符串的最后一个字符,$B 匹配 B 
    * 匹配前面的字符0次或多次 ba*rk可以匹配 brk、bark、baark等等 
    + 匹配前面的字符1次或多次 ba+rk可以匹配 bark、baark等等,但是不能匹配brk,也就是说,最少有以一次。 
    ? 匹配前面的字符0次或1次 ba?rk可以匹配 bark、brk等等,但是不能匹配baark。 
    {n} 匹配前面的字符恰好是n次,其中n是整数 hob{2}it可以匹配hobbit 
    {n,m} 匹配前面的字符至少是n次,最多是m次,其中n,m都是整数 hob{2,3}it可以匹配hobbit或者hobbbit 
    . 匹配除null以外的任意单个字符 hob.it中的.可以是任意的单个字符,如:hobsit等等 
    (pattern) 括号中pattern是一个子正则表达式,匹配指定pattern模式的一个子表达式。 如:aaa(x|y)可以匹配aaax或者aaay。 
    x|y 匹配“或” x|y可以匹配x或者y 
    [abc] 可以匹配abc中的任何单个字符 hello[abc]可以匹配helloa,hellob,helloc 
    [a-z] 可以匹配指定范围内的任何单个字符 hell[a-z]可以匹配hello或者hellz 
    [::] 指定一个字符类,可以匹配该类中的任何字符 [:alphanum:]可以匹配字符0-9、A-Z、a-z
    [:alpha:]可以匹配字符A-Z、a-z
    [:blank:]可以匹配空格或tab键
    [:digit:]可以匹配数字0-9
    [:graph:]可以匹配非空字符
    [:lower:]可以匹配小写字母a-z
    [:print:]与[:graph:]类似,不同之处在于[:print:]包括空格字符
    [:punct:]可以匹配标点符号.,""等等
    [:space:]可以匹配所有的空字符
    [:upper:]可以匹配大写字母A-Z
    [:xdigit:]可以匹配十六进制数字0-9、A-F、a-f 
    n 这是对前一次匹配命中的一个后引用,其中n是一个正整数 (.)1可以匹配两个连续相同的非空字符。(.)可以匹配除null以外的任何单个字符,而1则重复上一次匹配的内容,即再次匹配相同的字符,因此可以匹配两个连续相同的非空字符
    

    2、REGEXP_LIKE(x,pattern[,match_option])用于在x中查找正则表达式pattern,该函数还可以提供一个可选的参数match_option字符串说明默认的匹配选项。match_option的取值如下:

     ‘c’   说明在进行匹配时区分大小写(缺省值);
      'i'   说明在进行匹配时不区分大小写;
      'n'   允许使用可以匹配任意字符的操作符;
      'm'   将x作为一个包含多行的字符串。
    

    问题解决样例

    SELECT owner, t.segment_name, t.segment_type, sum(t.bytes / 1024 / 1024) "占用空间(M)"
    from dba_segments t
    where t.segment_type='TABLE'
    AND t.owner = 'MY_USER'
    --AND regexp_like(t.segment_name, '*[A-Z]$')
    AND NOT regexp_like(t.segment_name, '*[0-9]{4,6}$')  --使用NOT取非
    

    样例二:将字段中的多个空格与换行替换为单个空格

    SELECT t.redis_colony_id,
           REGEXP_REPLACE(t.redis_colony_message, '([[:space:]]+)', ' '),
           REPLACE(t.redis_colony_message,chr(10),',')
    FROM t_redis_colony_tst t
    ORDER BY t.redis_colony_id
    ;
    

    参考文章

    oracle正则表达式函数 匹配(含有样例)

    相关文章

      网友评论

        本文标题:Oracle正则表达式

        本文链接:https://www.haomeiwen.com/subject/yyilsxtx.html