美文网首页
正则案例二:匹配有且仅有3个连续数字的字符

正则案例二:匹配有且仅有3个连续数字的字符

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

一.需求描述

近期收到朋友的一个需求,需要在一堆字符串中查找连续3个数字的字符,连续数字可能出现在开头、中间、结尾,而且如果连续数字超过3个,也不符合条件。

二.解决方案

2.1 Oracle解决方案

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

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

我测试匹配开头使用\d居然未匹配出来,只能使用[0-9]

代码:

with tmp1 as
(
select 'abc12' str from dual
union 
select 'abc123' str from dual  -- OK 
union 
select 'abc123ab' str from dual  -- OK 
union 
select '123abc' str from dual   -- OK 
union
select '12abc123' str from dual  -- OK 
union 
select '12abc1234' str from dual
union 
select '1234abc12' str from dual
union
select '123' str from dual      -- OK
)
select *
  from tmp1
 where regexp_like(str, '/*?\D{1}\d{3}\D{1}\/*?')  -- 匹配连续数字出现在中间,有且仅有3个数字
   or  regexp_like(str, '*?\D{1}\d{3}$')           -- 匹配连续数字出现在结尾
   or  regexp_like(str, '^[0-9]{3}\D{1}\*?')       -- 匹配连续数字出现在开头
   or  regexp_like(str,'^[0-9]{3}$')               -- 匹配有且仅有3个数字的字符串

测试记录:

with tmp1 as
(
select 'abc12' str from dual
union 
select 'abc123' str from dual  -- OK 
union 
select 'abc123ab' str from dual  -- OK 
union 
select '123abc' str from dual   -- OK 
union
select '12abc123' str from dual  -- OK 
union 
select '12abc1234' str from dual
union 
select '1234abc12' str from dual
union
select '123' str from dual      -- OK
)
select *
  from tmp1
 where regexp_like(str, '/*?\D{1}\d{3}\D{1}\/*?')  -- 匹配连续数字出现在中间,有且仅有3个数字
   or  regexp_like(str, '*?\D{1}\d{3}$')           -- 匹配连续数字出现在结尾
   or  regexp_like(str, '^[0-9]{3}\D{1}\*?')       -- 匹配连续数字出现在开头
   or  regexp_like(str,'^[0-9]{3}$')               -- 匹配有且仅有3个数字的字符串

2.2 MySQL解决方案

MySQL的正则与Oracle的语法存在差异,需要重新写。

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

数字用 [0-9]
非数字用 [^0-9]
匹配多个表达式需要用[A]+[B] 其中[]是一个匹配的集合,“+”号是连接的意思。

匹配非字符次数的时候可以使用[^0-9]{0,} 表示匹配非数字字符0次或多次

代码:

with tmp1 as
(
select 'abc12' str from dual
union 
select 'abc123' str from dual  -- OK 
union 
select 'abc123ab' str from dual  -- OK 
union 
select '123abc' str from dual   -- OK 
union
select '12abc123' str from dual  -- OK 
union 
select '12abc1234' str from dual
union 
select '1234abc12' str from dual
union
select '123' str from dual      -- OK
)
select *
  from tmp1
 where str regexp '[^0-9]{1,}+[0-9]{3}+[^0-9]{1,}'   -- 匹配 %123%
    or str regexp '[^0-9]{1,}+[0-9]{3}$'             -- 匹配 %123
    or str regexp '^[0-9]{3}+[^0-9]{1,}'             -- 匹配 123%
    or str regexp '^[0-9]{3}$'                       -- 匹配 123

测试记录:

mysql> with tmp1 as
    -> (
    -> select 'abc12' str from dual
    -> union
    -> select 'abc123' str from dual  -- OK
    -> union
    -> select 'abc123ab' str from dual  -- OK
    -> union
    -> select '123abc' str from dual   -- OK
    -> union
    -> select '12abc123' str from dual  -- OK
    -> union
    -> select '12abc1234' str from dual
    -> union
    -> select '1234abc12' str from dual
    -> union
    -> select '123' str from dual      -- OK
    -> )
    -> select *
    ->   from tmp1
    ->  where str regexp '[^0-9]{1,}+[0-9]{3}+[^0-9]{1,}'   -- 匹配 %123%
    ->     or str regexp '[^0-9]{1,}+[0-9]{3}$'             -- 匹配 %123
    ->     or str regexp '^[0-9]{3}+[^0-9]{1,}'             -- 匹配 123%
    ->     or str regexp '^[0-9]{3}$'                       -- 匹配 123
    -> ;
+----------+
| str      |
+----------+
| abc123   |
| abc123ab |
| 123abc   |
| 12abc123 |
| 123      |
+----------+
5 rows in set (0.00 sec)

mysql>

参考:

  1. https://www.jb51.net/article/72928.htm

相关文章

  • 正则案例二:匹配有且仅有3个连续数字的字符

    一.需求描述 近期收到朋友的一个需求,需要在一堆字符串中查找连续3个数字的字符,连续数字可能出现在开头、中间、结尾...

  • Python 学习笔记 068

    正则表达式 Python检索正则的编写 正则表达式的具体应用 1.匹配单个字符与数字 . 匹...

  • 正则表达式记录

    项目中用到的一些简单正则表达式1.密码:a.仅有且必须有数字,字母,特殊字符^(?![\da-zA-Z]+$)(?...

  • 正则表达式

    正则:匹配有规律的字符串 1.创建方式 2.正则的方法:

  • 正则表达式

    正则表达式用于匹配字符串,通常用来判断用户输入数据是否合法。 正则基础: \d匹配一个数字:①`66\d`能成功匹...

  • PHP正则

    正则表达式基础 1.完整的正则表达式由两种字符组成。特殊字符(元字符)和普通字符(文本) 常见的元字符 . 匹...

  • js 正则取整正数,或浮点数且最多保留两位小数,去除字符串中的非

    js 正则取整正数,或浮点数且保留两位小数,去除字符串中的非数字

  • re

    re 代表的是 正则表达式 正则表达式可以包含特殊和普通字符 特殊字符:用来通配 普通字符:用来简单的匹...

  • day10(2017.10.24)

    正则表达式 正则表达式:是由一个字母数字和一些特殊符号组成的描述字符模式的对象 小案例

  • 2021-06-29-🟨 🟨 常用正则表达式

    常用正则表达式 1.数字,保留两位小数 1.1.有效数字,不以0结尾 2.连续相同字符 3.奇数 4.以某个字符开...

网友评论

      本文标题:正则案例二:匹配有且仅有3个连续数字的字符

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