正则案例一:匹配字母开头后面跟随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>

参考:

  1. https://www.jb51.net/article/72928.htm
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值