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

问题描述 投票:1回答:3

编辑

我需要识别至少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 - 这不应该匹配,因为它们具有除0以外的4位数字,它必须匹配除0以外的最小1位数字和0以外的最大3位数字

我正在使用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

谢谢

regex oracle12c
3个回答
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} - 重复一次,两次或三次 0* - 零个或多个零 [1-9] - 一个非零数字
  • 0* - 0+零
  • $ - 字符串的结尾。

Oracle demo online


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
投票

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

说明:它使用lookahead来验证后面的内容最多包含三个带有模式的零:qazxsw poi。

(?=^([123456789]*0){1,3}[123456789]*$)

© www.soinside.com 2019 - 2024. All rights reserved.