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

一.需求描述

今天朋友遇到一个问题,数据库中的某一列中字母开头后面跟随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个数字的字符串)