精华内容
下载资源
问答
  • REGEXP_REPLACE 函数

    2014-08-27 11:22:29
    REGEXP_REPLACE 函数 让我们首先看一下传统的 REPLACE SQL 函数,它把一个字符串用另一个字符串来替换。假设您的数据在正文中有不必要的空格,您希望用单个空格来替换它们。利用 REPLACE 函数,您需要准确地...
    REGEXP_REPLACE 函数



    让我们首先看一下传统的 REPLACE SQL 函数,它把一个字符串用另一个字符串来替换。假设您的数据在正文中有不必要的空格,您希望用单个空格来替换它们。利用 REPLACE 函数,您需要准确地列出您要替换多少个空格。然而,多余空格的数目在正文的各处可能不是相同的。下面的示例在 Joe 和 Smith 之间有三个空格。REPLACE 函数的参数指定要用一个空格来替换两个空格。在这种情况下,结果在原来的字符串的 Joe 和 Smith 之间留下了一个额外的空格。 


    SELECT REPLACE('Joe Smith',' ', ' ')
    AS replace
    FROM dual
    REPLACE
    ---------
    Joe Smith 


    REGEXP_REPLACE 函数把替换功能向前推进了一步,其语法在表 9 中列出。以下查询用单个空格替换了任意两个或更多的空格。( ) 子表达式包含了单个空格,它可以按 {2,} 的指示重复两次或更多次。 




    表 9: REGEXP_REPLACE 函数  


    语法


    说明


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


    该函数用一个指定的 replace_string 来替换匹配的模式,从而允许复杂的"搜索并替换"操作。






    SELECT REGEXP_REPLACE('Joe Smith',
    '( ){2,}', ' ')
    AS RX_REPLACE
    FROM dual
    RX_REPLACE
    ----------
    Joe Smith 


    后向引用 


    正则表达式的一个有用的特性是能够存储子表达式供以后重用;这也被称为后向引用(在表 10 中对其进行了概述)。它允许复杂的替换功能,如在新的位置上交换模式或显示重复出现的单词或字母。子表达式的匹配部分保存在临时缓冲区中。缓冲区从左至右进行编号,并利用 \digit 符号进行访问,其中 digit 是 1 到 9 之间的一个数字,它匹配第 digit 个子表达式,子表达式用一组圆括号来显示。 


    接下来的例子显示了通过按编号引用各个子表达式将姓名 Ellen Hildi Smith 转变为 Smith, Ellen Hildi。 


    SELECT REGEXP_REPLACE(
    'Ellen Hildi Smith',
    '(.*) (.*) (.*)', '\3, \1 \2')
    FROM dual
    REGEXP_REPLACE('EL
    ------------------
    Smith, Ellen Hildi 


    该 SQL 语句显示了用圆括号括住的三个单独的子表达式。每一个单独的子表达式包含一个匹配元字符 (.),并紧跟着 * 元字符,表示任何字符(除换行符之外)都必须匹配零次或更多次。空格将各个子表达式分开,空格也必须匹配。圆括号创建获取值的子表达式,并且可以用 \digit 来引用。第一个子表达式被赋值为 \1 ,第二个 \2,以此类推。这些后向引用被用在这个函数的最后一个参数 (\3, \1 \2) 中,这个函数有效地返回了替换子字符串,并按期望的格式来排列它们(包括逗号和空格)。表 11 详细说明了该正则表达式的各个组成部分。 


    后向引用对替换、格式化和代替值非常有用,并且您可以用它们来查找相邻出现的值。接下来的例子显示了使用 REGEP_SUBSTR 函数来查找任意被空格隔开的重复出现的字母数字值。显示的结果给出了识别重复出现的单词 is 的子字符串。 


    SELECT REGEXP_SUBSTR(
    'The final test is is the implementation',
    ([[:alnum:]]+)([[:space:]]+)\1') AS substr
    FROM dual
    SUBSTR
    ------
    is is 


    匹配参数选项 


    您可能已经注意到了正则表达式操作符和函数包含一个可选的匹配参数。这个参数控制是否区分大小写、换行符的匹配和保留多行输入。 


    正则表达式的实际应用 


    您不仅可以在队列中使用正则表达式,还可以在使用 SQL 操作符或函数的任何地方(比如说在 PL/SQL 语言中)使用正则表达式。您可以编写利用正则表达式功能的触发器,以验证、生成或提取值。 


    接下来的例子演示了您如何能够在一次列检查约束条件中应用 REGEXP_LIKE 操作符来进行数据验证。它在插入或更新时检验正确的社会保险号码格式。如 123-45-6789 和 123456789 之类格式的社会保险号码对于这种列约束条件是可接受的值。有效的数据必须以三个数字开始,紧跟着一个连字符,再加两个数字和一个连字符,最后又是四个数字。另一种表达式只允许 9 个连续的数字。竖线符号 (|) 将各个选项分开。 


    ALTER TABLE students


      ADD CONSTRAINT stud_ssn_ck CHECK


      (REGEXP_LIKE(ssn,


      '^([[:digit:]]{3}-[[:digit:]]{2}-[[:digit:]]{4}|[[:digit:]]{9})$'))


    由 ^ 和 $ 指示的开头或结尾的字符都是不可接受的。确保您的正则表达式没有分成多行或包含任何不必要的空格,除非您希望格式如此并相应地进行匹配。表 12 说明了该正则表达式示例的各个组成部分。 


    将正则表达式与现有的功能进行比较 


    正则表达式有几个优点优于常见的 LIKE 操作符和 INSTR、SUBSTR 及 REPLACE 函数的。这些传统的 SQL 函数不便于进行模式匹配。只有 LIKE 操作符通过使用 % 和 _ 字符匹配,但 LIKE 不支持表达式的重复、复杂的更替、字符范围、字符列表和 POSIX 字符类等等。此外,新的正则表达式函数允许检测重复出现的单词和模式交换。这里的例子为您提供了正则表达式领域的一个概览,以及您如何能够在您的应用程序中使用它们。 


    实实在在地丰富您的工具包 


    因为正则表达式有助于解决复杂的问题,所以它们是非常强大的。正则表达式的一些功能难于用传统的 SQL 函数来仿效。当您了解了这种稍显神秘的语言的基础构建程序块时,正则表达式将成为您的工具包的不可缺少的一部分(不仅在 SQL 环境下也在其它的编程语言环境下)。为了使您的各个模式正确,虽然尝试和错误有时是必须的,但正则表达式的简洁和强大是不容置疑的。 


    Alice Rischert (ar280@yahoo.com) 是哥伦比亚大学计算机技术与应用系的数据库应用程序开发和设计方向的主席。她编写了 Oracle SQL 交互手册 第 2 版 (Prentice Hall,2002)和即将推出的 Oracle SQL 示例 (Prentice Hall,2003)。Rischert 拥有超过 15 年的经验在财富 100 强公司内担任数据库设计师、DBA 和项目主管,并且她自从 Oracle version 5 起就一直使用 Oracle 产品。 


    表 1:定位元字符  


    元字符


    说明


    ^


    使表达式定位至一行的开头


    $


    使表达式定位至一行的末尾 


    表 2:量词或重复操作符  


    量词


    说明


    *


    匹配 0 次或更多次


    ?


    匹配 0 次或 1 次


    +


    匹配 1 次或更多次


    {m}


    正好匹配 m 次


    {m,}


    至少匹配 m 次


    {m, n}


    至少匹配 m 次但不超过 n 次


    表 3:预定义的 POSIX 字符类  


    字符类


    说明


    [:alpha:]


    字母字符


    [:lower:]


    小写字母字符


    [:upper:]


    大写字母字符


    [:digit:]


    数字


    [:alnum:]


    字母数字字符


    [:space:]


    空白字符(禁止打印),如回车符、换行符、竖直制表符和换页符


    [:punct:]


    标点字符


    [:cntrl:]


    控制字符(禁止打印)


    [:print:]


    可打印字符


    表 4:表达式的替换匹配和分组  


    元字符


    说明


    |


    替换


    分隔替换选项,通常与分组操作符 () 一起使用


    ( )


    分组


    将子表达式分组为一个替换单元、量词单元或后向引用单元(参见"后向引用"部分)


    [char]


    字符列表


    表示一个字符列表;一个字符列表中的大多数元字符(除字符类、^ 和 - 元字符之外)被理解为文字


    表 5:REGEXP_LIKE 操作符  


    语法


    说明


    REGEXP_LIKE(source_string, pattern
    [, match_parameter])


    source_string 支持字符数据类型(CHAR、VARCHAR2、CLOB、NCHAR、NVARCHAR2 和 NCLOB,但不包括 LONG)。pattern 参数是正则表达式的另一个名称。match_parameter 允许可选的参数(如处理换行符、保留多行格式化以及提供对区分大小写的控制)。


    表 6:REGEXP_INSTR 函数  


    语法


    说明


    REGEXP_INSTR(source_string, pattern
    [, start_position
    [, occurrence
    [, return_option
    [, match_parameter]]]])


    该函数查找 pattern ,并返回该模式的第一个位置。您可以随意指定您想要开始搜索的 start_position。 occurrence 参数默认为 1,除非您指定您要查找接下来出现的一个模式。return_option 的默认值为 0,它返回该模式的起始位置;值为 1 则返回符合匹配条件的下一个字符的起始位置。


    表 7: 5 位数字加 4 位邮政编码表达式的说明  


    语法


    说明


     


    必须匹配的空白


    [:digit:]


    POSIX 数字类 


    ]


    字符列表的结尾 


    {5}


    字符列表正好重复出现 5 次


    (


    子表达式的开头 


    -


    一个文字连字符,因为它不是一个字符列表内的范围元字符


    [


    字符列表的开头 


    [:digit:]


    POSIX [:digit:]类


    [


    字符列表的开头 


    ]


    字符列表的结尾


    {4}


    字符列表正好重复出现 4 次 


    )


    结束圆括号,结束子表达式 


    ?


    ? 量词匹配分组的子表达式 0 或 1 次,从而使得 4 位代码可选


    $


    定位元字符,指示行尾


    表 8:REGEXP_SUBSTR 函数  


    语法


    说明


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


    REGEXP_SUBSTR 函数返回匹配模式的子字符串。


    表 9: REGEXP_REPLACE 函数  


    语法


    说明


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


    该函数用一个指定的 replace_string 来替换匹配的模式,从而允许复杂的"搜索并替换"操作。


    表 10:后向引用元字符  


    元字符


    说明


    \digit


    反斜线


    紧跟着一个 1 到 9 之间的数字,反斜线匹配之前的用括号括起来的第 digit 个子表达式。
    (注意:反斜线在正则表达式中有另一种意义,取决于上下文,它还可能表示 Escape 字符。


    表 11:模式交换正则表达式的说明  


    正则表达式项目


    说明


    (


    第一个子表达式的开头 


    .


    匹配除换行符之外的任意单字符


    *


    重复操作符,匹配之前的 . 元字符 0 到 n 次


    )


    第一个子表达式的结尾;匹配结果在 \1
    中获取(在这个例子中,结果为 Ellen。)


     


    必须存在的空白 


    (


    第二个子表达式的开头 


    .


    匹配除换行符之外的任意单个字符 


    *


    重复操作符,匹配之前的 . 元字符 0 到 n 次


    )


    第二个子表达式的结尾;匹配结果在 \2
    中获取(在这个例子中,结果为 Hildi。)


     


    空白 


    (


    第三个子表达式的开头 tr> 


    .


    匹配除换行符之外的任意单字符 


    *


    重复操作符,匹配之前的 . 元字符 0 到 n 次


    )


    第三个子表达式的结尾;匹配结果在 \3
    中获取(在这个例子中,结果为 Smith。)


    表 12:社会保险号码正则表达式的说明  


    正则表达式项目


    说明


    ^


    行首字符(正则表达式在匹配之前不能有任何前导字符。)


    (


    开始子表达式并列出用 | 元字符分开的可替换选项


    [


    字符列表的开头


    [:digit:]


    POSIX 数字类 


    ]


    字符列表的结尾 


    {3}


    字符列表正好重复出现 3 次 


    -


    连字符 


    [


    字符列表的开头 


    [:digit:]


    POSIX 数字类


    ]


    字符列表的结尾 


    {2}


    字符列表正好重复出现 2 次 


    -


    另一个连字符 


    [


    字符列表的开头 


    [:digit:]


    POSIX 数字类 


    ]


    字符列表的结尾 


    {4}


    字符列表正好重复出现 4 次 


    |


    替换元字符;结束第一个选项并开始下一个替换表达式


    [


    字符列表的开头 


    [:digit:]


    POSIX 数字类


    ]


    字符列表的结尾


    {9}


    字符列表正好重复出现 9 次 


    )


    结束圆括号,结束用于替换的子表达式组


    $


    定位元字符,指示行尾;没有额外的字符能够符合模式
    展开全文
  • regexp_replace函数 进阶

    2021-01-29 11:17:33
    –使用regexp_replace函数 –所有相连的|都做去重处理,只保留一个 select regexp_replace(’|||||||||a|||||b|||||c||||||’,’[|]{2,}’,’|’); –去掉最前面和最后一个,两个| select regexp_replace(’|||a||b|...

    –使用regexp_replace函数
    –所有相连的|都做去重处理,只保留一个
    select regexp_replace(’|||||||||a|||||b|||||c||||||’,’[|]{2,}’,’|’);

    –去掉最前面和最后一个,两个|
    select regexp_replace(’|||a||b||||||c||||’,’1|[|]$’,’’);

    –前后各自去掉一个
    select regexp_replace(regexp_replace(’|||a||b||||||c||||’,’[|]{2,}’,’|’),’2|[|]$’,’’);


    1. | ↩︎

    2. | ↩︎

    展开全文
  • REGEXP_REPLACE函数-ORACLE

    2021-04-09 21:46:03
    REGEXP_REPLACE函数:REGEXP_REPLACE(s1,s2[,s3]) 使用s3字符串替换出现在s1字符串中的所有s2字符串,并返回替换后的字符串;正则表达式替换 select REGEXP_REPLACE(‘aa11234bb我都递收到3112’,’[0-9]’,‘h’) ...

    REGEXP_REPLACE函数:REGEXP_REPLACE(s1,s2[,s3]) 使用s3字符串替换出现在s1字符串中的所有s2字符串,并返回替换后的字符串;正则表达式替换
    select REGEXP_REPLACE(‘aa11234bb我都递收到3112’,’[0-9]’,‘h’) from dual; 将每个数字都替换成h
    select REGEXP_REPLACE(‘aa11234bb我都递收到3112’,’[^0-9]’,‘h’) from dual; 将非数字替换成h
    select REGEXP_REPLACE(‘aa11234bb我都递收到3112’,’[0-9]+’,‘h’) from dual; 将一个或多个(连在一起的数字)替换成h
    select REGEXP_REPLACE(‘111aa11234bb我都递收到3112’,’1+’,‘h’) from dual; 将以数字开头的部分替换成h
    select REGEXP_REPLACE(‘111aa11234bb我都递收到3112’,’[0-9]+$’,‘h’) from dual; 将以数字结尾的部分替换成h
    select REGEXP_REPLACE(‘111aa112cde34k我都递收到3112’,’[a-i]+’,‘h’) from dual; 将a到i的字符替换成h
    select REGEXP_REPLACE(‘111aa112cde34k我都递收到3112’,’[0-9]+|[a-d]+’,‘h’) from dual; |代表或者的关系
    select REGEXP_REPLACE(‘111aa112cde34k我都递收到3112’,’[0-9]+[a-d]+’,‘h’) from dual; 将数字(多个)和[a-d]连接在一起的字符替换成h
    select REGEXP_REPLACE(‘111aa112cde34k我都递收到3112’,’[0-9]+[a-d]?’,‘h’) from dual;
    select REGEXP_REPLACE(‘111aa 112cde 34k我都递收到3112’,’[[:space:]]+’,‘h’) from dual; 及那个空格替换成h

    **+:表示匹配前面的字表达式1次或多次(*号表示至少匹配0次)
    ^:匹配输入字符串开始的位置,对应like中的like ’xxx%’,即没有前模糊查询(^在[]中括号表示否的意思)
    $:匹配输入字符串结束的位置,对应like中的like ’%xxx’,即没有后模糊查询
    |:代表或者的关系
    ?:0个或1个
    前后加上^$表示精准匹配,即like ’xxx’**
    select d1 from t1 where regexp_like(d1,’^[0-9a-zA-Z]+$’)
    字符簇: 
    [[:alpha:]] 任何字母。
    [[:digit:]] 任何数字。
    [[:alnum:]] 任何字母和数字。
    [[:space:]] 任何白字符。
    [[:upper:]] 任何大写字母。
    [[:lower:]] 任何小写字母。
    [[:punct:]] 任何标点符号。
    [[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]。
    

    1. 0-9 ↩︎

    展开全文
  • hive之regexp_replace函数、split函数的正则 Hive中,regexp_replace函数的第2个参数是正则表达式,第3个参数是字符串 select split(regexp_replace(data,'\\},\\{','}||{'),'\\|\\|')[0]as test from...

    转载

    https://blog.csdn.net/yuxeaotao/article/details/89645781

    hive之regexp_replace函数、split函数的正则

    Hive中,regexp_replace函数的第2个参数是正则表达式,第3个参数是字符串

    
     
    1. select split(regexp_replace(data,'\\},\\{','}||{'),'\\|\\|')[0]as test

    2. from

    3. (select '[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]'

    4. as data) a

    split函数解析也是正则

    因此上面如果写成这样:

    
     
    1. select split(regexp_replace(data,'\\},\\{','}||{'),'||')[0]as test #这里做了修改

    2. from

    3. (select '[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]'

    4. as data) a

    就得不到想要的结果了

    参考自:https://blog.csdn.net/longshenlmj/article/details/49027145

     

    常用的

        select   size(split(
        regexp_replace(
         regexp_replace(get_json_object(data_map, '$.data_map'), '\\}\\,\\{','\\}\\;\\{')
                             ,'\\]|\\[','')
                                   ,'\\;')) as split1_size
         from  xxx.xxx_table
        where pt ='2021-02-01'
        limit 1000

    切分之后看数组长度

    展开全文
  • REGEXP_REPLACE让你搜索的字符串的正则表达式模式REPLACE函数的功能。默认情况下, 该函数返回source_char与replace_...Oracle数据库中的REGEXP_REPLACE函数的语法是: REGEXP_REPLACE(source_char, pattern [, ...
  • replace函数(不知支持正则表达式)语法: replace(原字段,“原字段旧内容“,...regexp_replace函数(是replace函数的扩展函数,用于通过正则表达式来进行匹配替换)例如: --http://egpweb.ybsggzyjyxxw.com/ne...
  • regexp_replace函数的使用方法

    千次阅读 2020-05-23 15:52:23
    regexp_replace语法 regexp_replace(source_char,pattern[,replace_string[,position[,occurrence[,maych_parameter]]]]); –source_char 搜索值的字符表达式。这通常是一个字符列,可以是任何数据类型char,...
  • regexp_replace(1,2,3,4,5,6) 语法说明:1:字段 2:替换的字段 3:替换成什么 4:起始位置(默认从1开始) 5:替换的次数(0是无限次) 6:不区分大小写 【补充:】用regexp_replace来判断oracle中的某列为数字...
  • MySQL 正则替换数据:REGEXP_REPLACE函数

    千次阅读 2020-08-20 16:30:18
    表数据 功能需求:把 name 字段中的a标签内容替换为空 ...REGEXP_REPLACE()函数用于模式匹配。它通过匹配字符来替换给定的字符串字符。 REGEXP_REPLACE(expr,pat,repl[,pos[,occurrence[,mat...
  • REGEXP_REPLACE()函数用于模式匹配。它通过匹配字符来替换给定的字符串字符。 REGEXP_REPLACE(expr,pat,repl[,pos[,occurrence[,match_type]]]) Replaces occurrences in the stringexprthat match the regular ...
  • 在使用regexp_extract、regexp_replace函数过滤特殊字符时,发现不同的执行情境下(hive -e;hive -f),正则表达式的内容有变化,表现为是否要添加"\"进行转义,hive -e "SQL"方式需要进行转义...
  • select regexp_replace(mc,'(.+)','') from BI
  • oracle regexp_replace函数

    千次阅读 2014-10-17 18:09:01
    update t_Guideword set title = regexp_replace(title, '导游词$', null)  http://www.itpub.net/thread-1690590-1-1.html
  • postgre regexp_replace函数

    千次阅读 2012-03-20 10:46:24
    UPDATE 表 set 字段=regexp_replace(vendorcontacts,'.*', '')   解释:vendorcontacts字段数据里,以开头,结尾的部分,整个的替换为
  • REGEXP_REPLACE(inputString, regexString, replacementString) 第一个参数:表中字段 第二个参数:正则表达式 第三个参数:要替换称为的字符 函数使用起来比较简单,但是也有坑,当要匹配特殊的隐藏字符\n \r \t ,...
  • oracle中replace函数: 用法:replace(tarString,paString,gString)。 参数说明:tarString,要替换的原字符串;paString,需要替换的子字符串;gString,需要替换的目标字符串。 具体说明: select replace('...
  • [每日一题] OCP1z0-047 :2013-08-01 正则表达式--- REGEXP_REPLACE 函数
  • Oracle正则表达式函数:regexp_like、regexp_substr、regexp_instr、regexp_replace --去掉所有特殊字符,只剩字母 SELECTREGEXP_REPLACE('(Sam-Tomats123-=,.231+)','[^[:alpha:]]','')FROMdual; Sql...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 661
精华内容 264
关键字:

regexp_replace函数