正则表达式匹配至少6位数字的号码,最多只能有3位与0不同的数字

时间:2018-10-09 09:28:48

标签: regex oracle12c

编辑

我需要识别所有至少6位数字和最多25位数字,其中只有1到3位数字与0不同。

示例:000123、0103040000、10320000、70000000、12000009000

我正在尝试这样的事情:

regexp_like(number, '[1-9]\d{1,3}') AND regexp_like(number,'(0){5,24}')

(可以使用多个正则表达式)

但这也可以匹配数字:

0046700000031,00394000007-这不应该匹配,因为它们有4个非0的数字,它必须与最小1个非0的数字和最大3个非0的数字匹配

我正在使用Oracle 12C。

解决方案

这是我找到的替代方法,它似乎可行,但我只能在Oracle中使用。

SELECT NUMBER
FROM TABLE t
WHERE LENGTH(NUMBER) > 5 HAVING(regexp_count(NUMBER, '0') > 2
      AND regexp_count(NUMBER, '[1-9]') BETWEEN 1 AND 3)
GROUP BY NUMBER

谢谢

3 个答案:

答案 0 :(得分:1)

一种选择是使用正向查找来检查至少一个但不超过三个非零数字:

^(?=.*[1-9])(?!.*[1-9].*[1-9].*[1-9].*[1-9])[0-9]{6,25}$

在诸如Postgres之类的数据库中,我们可以尝试以下查询:

SELECT *
FROM yourTable
WHERE number ~ '^(?=.*[1-9])(?!.*[1-9].*[1-9].*[1-9].*[1-9])[0-9]{6,25}$';

使用像SQL Server这样的数据库,它不直接支持正则表达式,但是具有某些正则表达式LIKE功能,我们可以尝试:

WHERE LEN(number) BETWEEN 6 AND 25 AND             -- 6 to 25 digits
      number LIKE '%[1-9]%' AND                    -- at least 1 non zero digit
      number NOT LIKE '%[1-9]%[1-9]%[1-9]%[1-9]%'  -- at most 3 non zero digits
      number NOT LIKE '%[^0-9]%';                  -- all numbers

答案 1 :(得分:1)

尝试使用此模式(?=^([123456789]*0){1,3}[123456789]*$)\d{6,25}

说明:它使用前瞻性来确认后面的内容最多包含三个零,其模式为:(?=^([123456789]*0){1,3}[123456789]*$)

Demo

答案 2 :(得分:1)

您不能使用单个正则表达式在Oracle 12C中执行所需的操作,因为该正则表达式引擎基于POSIX,并且不允许进行环顾,回溯和前瞻。您需要使用单个模式来检查字符串的格式,并使用常规的LENGTH函数。

这是完整的演示:

WITH testdata(txt) AS (
      SELECT '000123'        from dual
      UNION
      SELECT '0103040000'    from dual
      UNION
      SELECT '10320000'      from dual
      UNION
      SELECT '70000000'      from dual
      UNION
      SELECT '12000009000'   from dual
      UNION
      SELECT '0046700000031' from dual
      UNION
      SELECT '00394000007'   from dual
   )
   SELECT * FROM testdata WHERE REGEXP_LIKE(txt, '^(0*[1-9]){1,3}0*$') AND LENGTH(txt) > 5 AND LENGTH(txt) < 26

请参见regex demo。详细信息:

  • ^-字符串的开头
  • (0*[1-9]){1,3}-重复1、2或3次
    • 0*-零个或多个零点
    • [1-9]-一个非零数字
  • 0*-0+零
  • $-字符串的结尾。

请参见Oracle demo online