美文网首页
正则案例一:匹配字母开头后面跟随14个数字的字符串

正则案例一:匹配字母开头后面跟随14个数字的字符串

作者: 只是甲 | 来源:发表于2021-03-26 10:59 被阅读0次

    一.需求描述

    今天朋友遇到一个问题,数据库中的某一列中字母开头后面跟随14个数字的字符串,例如 'a12345678912345' 这种。

    其实各个编程语言例如Java、Python等都有自己的正则,朋友不想那么麻烦,想在数据库里面来实现。

    二.解决方案

    2.1 Oracle的解决方案

    Oracle的正则表达式虽然没有Java、Python的那么强大,但是也足够够用。

    ^ 匹配每一行的开头,单行模式下等价于字符串的开头
    $ 匹配每一行的结尾,单行模式下等价于字符串的结尾

    字母可以使用 [a-zA-Z]
    数字可以用 \d 或者 [0-9]

    因为存在两个匹配的规则,所以需要使用到组合
    (…) 圆括号,将复杂表达式当作单一表达式来处理

    代码:

    SELECT *
      from 
    (
    select 'a12345678912345' as str1 from dual
    union ALL
    select '12345678912345' as str1 from dual
    union ALL
    select 'a12345678912345abc' as str1 from dual
    union ALL
    select 'a1234567891234' as str1 from dual
    union ALL
    select 'ab12345678912345' as str1 from dual
    ) tmp1
     where regexp_like(str1,'(^[a-zA-Z])(\d{14}$)')
    

    测试记录:

    SQL> SELECT *
      2    from
      3  (
      4  select 'a12345678912345' as str1 from dual
      5  union ALL
      6  select '12345678912345' as str1 from dual
      7  union ALL
      8  select 'a12345678912345abc' as str1 from dual
      9  union ALL
     10  select 'a1234567891234' as str1 from dual
     11  union ALL
     12  select 'ab12345678912345' as str1 from dual
     13  ) tmp1
     14   where regexp_like(str1,'(^[a-zA-Z])(\d{14}$)')
     15  /
    STR1
    ------------------
    a12345678912345
    

    2.2 MySQL 解决方案

    MySQL的正则比Oracle弱一些,但是也足够了对付一些日常需求了。

    ^ 匹配每一行的开头,单行模式下等价于字符串的开头
    $ 匹配每一行的结尾,单行模式下等价于字符串的结尾

    字母可以使用 [a-zA-Z]
    数字可以用 [0-9]
    Oracle的 \d MySQL 无法识别

    目前mysql也不支持类Oracle的组合操作符,只能分开写。

    代码:

    SELECT *
      from 
    (
    select 'a12345678912345' as str1
    union ALL
    select '12345678912345' as str1
    union ALL
    select 'a12345678912345abc' as str1
    union ALL
    select 'a1234567891234' as str1
    ) tmp1
     where str1 regexp '^[a-zA-Z]'
       and str1 regexp '[0-9]{14}$'
    

    测试记录:

    mysql> SELECT *
        ->   from
        -> (
        -> select 'a12345678912345' as str1
        -> union ALL
        -> select '12345678912345' as str1
        -> union ALL
        -> select 'a12345678912345abc' as str1
        -> union ALL
        -> select 'a1234567891234' as str1
        -> ) tmp1
        ->  where str1 regexp '^[a-zA-Z]'
        ->    and str1 regexp '[0-9]{14}$'
        -> ;
    +-----------------+
    | str1            |
    +-----------------+
    | a12345678912345 |
    +-----------------+
    1 row in set (0.00 sec)
    
    mysql>
    

    相关文章

      网友评论

          本文标题:正则案例一:匹配字母开头后面跟随14个数字的字符串

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