• SQL-正则表达式



    正则表达式

    正则表达式是一种用来描述字符串模式的工具,它可以用于匹配、查找、替换等操作。正则表达式由字符和特殊字符组成,可以使用这些字符来定义匹配规则。

    1.常用的正则表达式字符和特殊字符

    常用的正则表达式字符和特殊字符有:

    1. 普通字符:表示匹配该字符本身,如a表示匹配字母"a"。
    2. 元字符:具有特殊含义的字符,如 . 表示匹配除换行符以外的任意字符。
    3. 字符类:用[]表示,表示匹配括号内的任意一个字符,如 [abc]表示匹配字符"a"、“b"或"c”。
    4. 反义字符类:用[^] 表示,表示匹配除括号内字符以外的任意字符,如 [^abc]表示匹配除"a"、“b”、"c"以外的任意字符。
    5. 重复字符:用*+?表示,分别表示匹配前一个字符0次或多次、1次或多次、0次或1次。
    6. 边界匹配:用^$表示,分别表示匹配字符串的开头和结尾。
    7. 分组:用()表示,可以将多个字符组合为一个整体,如(ab)+表示匹配"ab"、“abab”、"ababab"等。
    8. 转义字符:用\表示,可以将特殊字符转义为普通字符,如.表示匹配字符"."。

    2.正则表达式的用法:

    1. 匹配:使用match()函数可以在字符串中查找匹配正则表达式的部分,并返回一个包含匹配结果的数组。
    2. 查找:使用search()函数可以在字符串中查找匹配正则表达式的部分,并返回第一个匹配的位置。
    3. 替换:使用replace()函数可以将字符串中匹配正则表达式的部分替换为指定的内容。
    4. 分割:使用split()函数可以根据正则表达式将字符串分割为多个部分,并返回一个数组。

    3.其他用法:

    1.量词

    用来指定前面的字符或字符类的重复次数。
    常用的量词有:

    • *:匹配前一个字符0次或多次。

    • +:匹配前一个字符1次或多次。

    • ?:匹配前一个字符0次或1次。

    • {n}:匹配前一个字符恰好n次。

    • {n,}:匹配前一个字符至少n次。

    • {n,m}:匹配前一个字符至少n次,最多m次。

    2.特殊字符

    • .:匹配除换行符以外的任意字符。
    • \d:匹配数字字符。
    • \D:匹配非数字字符。
    • \w:匹配字母、数字、下划线字符。
    • \W:匹配非字母、数字、下划线字符。
    • \s:匹配空白字符(空格、制表符、换行符等)。
    • \S:匹配非空白字符。
    • \b:匹配单词边界。
    • \B:匹配非单词边界。

    3.分组和引用

    ():将多个字符组合为一个整体。
    (?:):非捕获分组,用于只匹配但不捕获。
    \1\2、…:引用前面的分组,用于匹配相同的内容。

    4.断言

    • (?=...):正向肯定前瞻,用于匹配满足某个条件的位置。
    • (?!...):正向否定前瞻,用于匹配不满足某个条件的位置。
    • (?<=...):反向肯定后顾,用于匹配位于某个条件之后的位置。
    • (?:反向否定后顾,用于匹配不位于某个条件之后的位置。
    模式描述
    ^匹配输入字符串的开始位置
    $匹配输入字符串的结束位置
    .匹配除“\n”之外的任何单个字符
    […]字符集合。匹配所包含任意一个字符。例如,‘[abc]’可以匹配“plain”中的‘a’。
    [^…]负值字符集合。匹配未包含任意字符。例如,‘[^abc]’可以匹配“plain”中的‘p’。
    p1|p2|p3匹配p1或p2或p3。例如,‘z|food’能匹配“z”或“food”。‘(z|f)ood’则匹配“zood”或“food”。
    模式描述
    *匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。
    +匹配前面的子表达式一次或多次。例如,‘zo+’能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
    {n}n是一个非负整数。匹配稳定的n次。例如,‘o{2}’不能匹配“Bob”中的‘o’,但是能匹配“food”中的两个o。
    {n,m}m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次

    正则表达式的用法非常灵活,可以根据具体的需求来选择合适的字符、特殊字符、量词、分组等来构建匹配规则。同时,正则表达式还支持一些高级的特性,如贪婪模式、非贪婪模式、修饰符等,可以进一步扩展正则表达式的功能。

    正则表达式的详细用法还有很多,可以根据具体的需求来选择合适的正则表达式和相应的函数来进行操作。

    1.操作1

    代码如下(示例):

    -- ^ 在字符串开始处进行匹配
    SELECT 'abc' REGEXP '^a';
    -- $ 在字符串末尾开始匹配
    SELECT 'abc' REGEXP 'a$';
    SELECT 'abc' REGEXP 'c$’;
    -- . 匹配任意字符
    SELECT 'abc' REGEXP '.b';
    SELECT 'abc' REGEXP '.c';
    SELECT 'abc' REGEXP 'a.';
    -- [...] 匹配括号内的任意单个字符
    SELECT 'abc' REGEXP '[xyz]';
    SELECT 'abc' REGEXP '[xaz]';
    
    
    2.操作2

    代码如下(示例):

    -- [^...] 注意 ^ 符合只有在 [] 内才是取反的意思,在别的地方都是表示开始处匹配
    SELECT 'a' REGEXP '[^abc]';
    SELECT 'x' REGEXP '[^abc]';
    SELECT 'abc' REGEXP '[^a]';
    -- a* 匹配 0 个或多个 a, 包括空字符串。 可以作为占位符使用 . 有没有指定字符都可以匹配
    到数据
    SELECT 'stab' REGEXP '.ta*b';
    SELECT 'stb' REGEXP '.ta*b';
    SELECT '' REGEXP 'a*';
    -- a+ 匹配 1 个或者多个 a, 但是不包括空字符
    SELECT 'stab' REGEXP '.ta+b';
    SELECT 'stb' REGEXP '.ta+b';
    
    
    3.操作3

    代码如下(示例):

    -- [^...] 注意 ^ 符合只有在 [] 内才是取反的意思,在别的地方都是表示开始处匹配
    SELECT 'a' REGEXP '[^abc]';
    SELECT 'x' REGEXP '[^abc]';
    SELECT 'abc' REGEXP '[^a]';
    -- a* 匹配 0 个或多个 a, 包括空字符串。 可以作为占位符使用 . 有没有指定字符都可以匹配
    到数据
    SELECT 'stab' REGEXP '.ta*b';
    SELECT 'stb' REGEXP '.ta*b';
    SELECT '' REGEXP 'a*';
    -- a+ 匹配 1 个或者多个 a, 但是不包括空字符
    SELECT 'stab' REGEXP '.ta+b';
    SELECT 'stb' REGEXP '.ta+b';
    
    
    4.操作4
    -- a{m,n} 匹配 m 到 n 个 a, 包含 m 和 n
    SELECT 'auuuuc' REGEXP 'au{3,5}c';
    SELECT 'auuuuc' REGEXP 'au{4,5}c';
    SELECT 'auuuuc' REGEXP 'au{5,10}c';
    -- (abc) abc 作为一个序列匹配,不用括号括起来都是用单个字符去匹配,如果要把多个字符
    作为一个整体去匹配就需要用到括号,所以括号适合上面的所有情况。
    SELECT 'xababy' REGEXP 'x(abab)y';
    SELECT 'xababy' REGEXP 'x(ab)*y';
    SELECT 'xababy' REGEXP 'x(ab){1,2}y';
    
    

    4.案例应用:

    create_table stb00 as
    select * from test01
    ;
    
    create_table stb01 as
    select col_02,col_03 from stb00
    where col_03<>'应用程序版本号'
    and  length(col_03)=12
    ;
    --col_03匹配格式为xx-xx-xxxxxx x代表16进制字符(包括大小写)
    create_table stb02 as
    select 
    	col_02,
    	col_03,
    	col_03 REGEXP '(^[0123456789|abcdefABCDEF][0123456789|abcdefABCDEF][\.][0123456789|abcdefABCDEF][0123456789|abcdefABCDEF][\.][0123456789|abcdefABCDEF][0123456789|abcdefABCDEF][0123456789|abcdefABCDEF][0123456789|abcdefABCDEF][0123456789|abcdefABCDEF][0123456789|abcdefABCDEF]$)'
    from 
    	stb01
    ;
    
    select * from stb02
    limit 100000;
    
  • 相关阅读:
    [附源码]计算机毕业设计springboot高校车辆管理系统
    Git用户名/密码/邮箱,及设置git配置
    JAVA大学生互动交流论坛计算机毕业设计Mybatis+系统+数据库+调试部署
    【三维目标检测】Part-A2(二)
    hdu 3549 a flow problem 的多种解法
    ChatGPT科研与AI绘图及论文高效写作教程
    C语言学习-19-全排列
    基于参与意愿的物流联盟资源优化配置模型
    H5实现预览pdf(PC+移动端都可以)
    RFID技术在仓储物流供应链管理中的应用
  • 原文地址:https://blog.csdn.net/weixin_43138792/article/details/140456945