美文网首页Java 杂谈Java码农的世界
Oracle中的正则表达式(及函数)详解

Oracle中的正则表达式(及函数)详解

作者: 一觉睡到丶小时候 | 来源:发表于2019-07-02 15:28 被阅读0次

    运算符

    在介绍函数前,这里先说明一下Oracle中正则表达式运算符及其描述。
    如果不知道他们有什么用,或者也不知道描述说的是什么,没关系,可以先看后面的介绍,就知道他们的含义了。


    图片.png

    oracle 正则表达式 匹配

    ORACLE中的支持正则表达式的函数主要有下面四个:
    REGEXP_LIKE :与LIKE的功能相似
    
    REGEXP_INSTR :与INSTR的功能相似
    
    REGEXP_SUBSTR :与SUBSTR的功能相似
    
    REGEXP_REPLACE :与REPLACE的功能相似
    

    它们在用法上与Oracle SQL 函数LIKE、INSTR、SUBSTR 和REPLACE 用法相同,但是它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符。

    POSIX 正则表达式由标准的元字符(metacharacters)所构成:
    '^' 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。
    '$' 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。
    '.' 匹配除换行符之外的任何单字符。
    '?' 匹配前面的子表达式零次或一次。
    '+' 匹配前面的子表达式一次或多次。
    '*' 匹配前面的子表达式零次或多次。
    '|' 指明两项之间的一个选择。例子'^([a-z]+|[0-9]+)$'表示所有小写字母或数字组合成的字符串。
    '( )' 标记一个子表达式的开始和结束位置。
    '[]' 标记一个中括号表达式。
    '{m,n}' 一个精确地出现次数范围,m=<出现次数<=n,'{m}'表示出现m次,'{m,}'表示至少出现m次。\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。
    字符簇:
    [[:alpha:]] 任何字母。
    [[:digit:]] 任何数字。
    [[:alnum:]] 任何字母和数字。
    [[:space:]] 任何白字符。
    [[:upper:]] 任何大写字母。
    [[:lower:]] 任何小写字母。
    [[:punct:]] 任何标点符号。
    [[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]。
    各种操作符的运算优先级
    \转义符
    (), (?:), (?=), [] 圆括号和方括号
    *, +, ?, {n}, {n,}, {n,m} 限定符
    ^, $, anymetacharacter 位置和顺序
    
    regexp_like

    --查询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:]]');
    

    相关函数

    函数中pattern为正则表达式,最多可以包含512个字节。

    REGEXP_SUBSTR

    REGEXP_SUBSTR函数使用正则表达式来指定返回串的起点和终点。
    语法:

    regexp_substr(source_string,pattern[,position[,occurrence[,match_parameter]]])
    

    source_string:源串,可以是常量,也可以是某个值类型为串的列。
    position:从源串开始搜索的位置。默认为1。
    occurrence:指定源串中的第几次出现。默认值1.
    match_parameter:文本量,进一步订制搜索,取值如下:

    • 'i' 用于不区分大小写的匹配。
    • 'c' 用于区分大小写的匹配。
    • 'n' 允许将句点“.”作为通配符来匹配换行符。如果省略改参数,句点将不匹配换行符。
    • 'm' 将源串视为多行。即将“^”和“$”分别看做源串中任意位置任意行的开始和结束,而不是看作整个源串的开始或结束。如果省略该参数,源串将被看作一行来处理。
    • 如果取值不属于上述中的某个,将会报错。如果指定了多个互相矛盾的值,将使用最后一个值。如'ic'会被当做'c'处理。
    REGEXP_INSTR

    REGEXP_INSTR函数使用正则表达式返回搜索模式的起点和终点(整数)。如果没有发现匹配的值,将返回0。
    语法:

    regexp_instr(source_string,pattern[,position[,occurrence[,return_option[,match_parameter]]]])
    

    REGEXP_INSTR函数常常会被用到where子句中。

    REGEXP_LIKE

    通常使用REGEXP_LIKE进行模糊匹配。
    语法:

    regexp_like(source_string,pattern[match_parameter])
    

    该函数可以使用前面介绍的所有搜索功能作为REGEXP_LIKE搜索的一部分,可以是非常复杂的搜索变得简单。

    REPLACE和REGEXP_REPLACE

    REPLACE函数用于替换串中的某个值。
    语法:

    replace(char,search_string[,replace_string])
    

    如果不指定replace_string,会将搜索到的值删除
    REGEXP_REPLACE是REPLACE的增强版,支持正则表达式,扩展了一些功能。
    语法:

    regexp_replace(source_string,pattern[,replace_string[,position[,occurrence[,match_parameter]]]])
    

    replace_string表示用什么来替换source_string中与pattern匹配的部分。
    occurrence为非负整数,0表示所有匹配项都被替换,为正数时替换第n次匹配。

    REGEXP_COUNT

    REGEXP_COUNT函数返回在源串中出现的模式的次数,作为对REGEXP_INSTR函数的补充。
    虽然COUNT是一个集合函数,操作的是行组,但是REGEXP_COUNT是单行函数,分别计算每一行。
    语法:

    regexp_count(source_char,pattern[,position[,match_param]])
    

    REGEXP_COUNT返回pattern在source_char串中出现的次数。如果未找到匹配,函数返回0。
    metch_param参数,相对于前面介绍的match_parameter参数多一个取值“x”。
    'x':忽略空格字符。默认情况下,空格与自身想匹配。
    metch_param如果指定了多个互相矛盾的值,将使用最后一个值。

    相关文章

      网友评论

        本文标题:Oracle中的正则表达式(及函数)详解

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